github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgTime/time.go (about) 1 package kmgTime 2 3 import ( 4 "fmt" 5 "time" 6 "math" 7 ) 8 9 const ( 10 Day = 24 * time.Hour 11 ) 12 13 var DefaultTimeZone = BeijingZone 14 15 //auto guess format from ParseFormatGuessList 16 func ParseAutoInLocation(sTime string, loc *time.Location) (t time.Time, err error) { 17 for _, format := range ParseFormatGuessList { 18 t, err = time.ParseInLocation(format, sTime, loc) 19 if err == nil { 20 return 21 } 22 } 23 err = fmt.Errorf("[ParseAutoInLocation] time: %s can not parse", sTime) 24 return 25 } 26 27 func FixLocalTimeToOffsetSpecifiedZoneTime(timeOffset int, localTime string) string { 28 clientTimeZone := time.FixedZone("ClientTimeZone", timeOffset) 29 serverTime := MustParseAutoInDefault(localTime) 30 return serverTime.In(clientTimeZone).Format(FormatMysql) 31 } 32 33 func MustParseAutoInDefault(sTime string) (t time.Time) { 34 t, err := ParseAutoInLocation(sTime, DefaultTimeZone) 35 if err != nil { 36 panic(err) 37 } 38 return t 39 } 40 41 func ParseAutoInDefault(sTime string) (t time.Time, err error) { 42 return ParseAutoInLocation(sTime, DefaultTimeZone) 43 } 44 45 //utc time 46 func MustFromMysqlFormat(timeString string) time.Time { 47 t, err := time.Parse(FormatMysql, timeString) 48 if err != nil { 49 panic(err) 50 } 51 return t 52 } 53 54 func MustFromMysqlFormatInLocation(timeString string, loc *time.Location) time.Time { 55 t, err := time.ParseInLocation(FormatMysql, timeString, loc) 56 if err != nil { 57 panic(err) 58 } 59 return t 60 } 61 62 //使用默认时区解释mysql 数据结构 63 func MustFromMysqlFormatDefaultTZ(timeString string) time.Time { 64 if timeString == "0000-00-00 00:00:00" { 65 return time.Time{} 66 } 67 t, err := time.ParseInLocation(FormatMysql, timeString, DefaultTimeZone) 68 if err != nil { 69 panic(err) 70 } 71 return t 72 } 73 74 //local time 75 func MustFromLocalMysqlFormat(timeString string) time.Time { 76 t, err := time.ParseInLocation(FormatMysql, timeString, time.Local) 77 if err != nil { 78 panic(err) 79 } 80 return t 81 } 82 83 func ToLocal(t time.Time) time.Time { 84 return t.Local() 85 } 86 87 func ToDateString(t time.Time) string { 88 return t.Format(FormatDateMysql) 89 } 90 91 //规整到日期,去掉时分秒 92 func ToDate(t time.Time) time.Time { 93 y, m, d := t.Date() 94 return time.Date(y, m, d, 0, 0, 0, 0, t.Location()) 95 } 96 97 //规整到日期然后相减 98 func DateSub(t1 time.Time, t2 time.Time, loc *time.Location) time.Duration { 99 return ToDate(t1.In(loc)).Sub(ToDate(t2.In(loc))) 100 } 101 102 //规整到日期然后相减,返回天数 103 func DateSubToDay(t1 time.Time, t2 time.Time, loc *time.Location) int { 104 dur := ToDate(t1.In(loc)).Sub(ToDate(t2.In(loc))) 105 return int(dur.Hours() / 24) 106 } 107 108 func DateSubLocal(t1 time.Time, t2 time.Time) time.Duration { 109 return DateSub(t1, t2, time.Local) 110 } 111 112 //是否同一天 113 func IsSameDay(t1 time.Time, t2 time.Time, loc *time.Location) bool { 114 return DateSub(t1, t2, loc) == 0 115 } 116 117 //规则到秒,去掉毫秒什么的 118 func ModBySecond(t1 time.Time) time.Time { 119 return t1.Round(time.Second) 120 } 121 122 func GetUnixFloat(t1 time.Time) float64{ 123 return (float64(t1.Nanosecond())/1e9)+float64(t1.Unix()) 124 } 125 126 func FromUnixFloat(f float64) time.Time{ 127 s,ns:=math.Modf(f) 128 return time.Unix(int64(s),int64(ns*1e9)).In(DefaultTimeZone) 129 }