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  }