time_parse.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package time_parse
  2. import (
  3. "math"
  4. "net/http"
  5. "time"
  6. )
  7. var (
  8. cst *time.Location
  9. )
  10. // China Standard Time Layout
  11. const (
  12. CSTLayout = "2006-01-02 15:04:05"
  13. CSTDateLayout = "2006-01-02"
  14. )
  15. func init() {
  16. var err error
  17. if cst, err = time.LoadLocation("Asia/Shanghai"); err != nil {
  18. panic(err)
  19. }
  20. }
  21. // RFC3339ToCSTLayout convert rfc3339 value to china standard time layout
  22. // 2020-11-08T08:18:46+08:00 => 2020-11-08 08:18:46
  23. func RFC3339ToCSTLayout(value string) (string, error) {
  24. ts, err := time.Parse(time.RFC3339, value)
  25. if err != nil {
  26. return "", err
  27. }
  28. return ts.In(cst).Format(CSTLayout), nil
  29. }
  30. func GetMicroTime() int64 {
  31. ts := time.Now().In(cst).UnixNano()
  32. return ts / 1e6
  33. }
  34. // CSTLayoutString 格式化时间
  35. // 返回 "2006-01-02 15:04:05" 格式的时间
  36. func CSTLayoutString() string {
  37. ts := time.Now()
  38. return ts.In(cst).Format(CSTLayout)
  39. }
  40. // ParseCSTInLocation 格式化时间
  41. func ParseCSTInLocation(date string) (time.Time, error) {
  42. return time.ParseInLocation(CSTLayout, date, cst)
  43. }
  44. // CSTLayoutStringToUnix 返回 unix 时间戳
  45. // 2020-01-24 21:11:11 => 1579871471
  46. func CSTLayoutStringToUnix(cstLayoutString string) (int64, error) {
  47. stamp, err := time.ParseInLocation(CSTLayout, cstLayoutString, cst)
  48. if err != nil {
  49. return 0, err
  50. }
  51. return stamp.Unix(), nil
  52. }
  53. // GMTLayoutString 格式化时间
  54. // 返回 "Mon, 02 Jan 2006 15:04:05 GMT" 格式的时间
  55. func GMTLayoutString() string {
  56. return time.Now().In(cst).Format(http.TimeFormat)
  57. }
  58. // ParseGMTInLocation 格式化时间
  59. func ParseGMTInLocation(date string) (time.Time, error) {
  60. return time.ParseInLocation(http.TimeFormat, date, cst)
  61. }
  62. // SubInLocation 计算时间差
  63. func SubInLocation(ts time.Time) float64 {
  64. return math.Abs(time.Now().In(cst).Sub(ts).Seconds())
  65. }
  66. // GetFirstDateOfMonth 获取传入的时间所在月份的第一天,即某月第一天的0点。如传入time.Now(), 返回当前月份的第一天0点时间。
  67. func GetFirstDateOfMonth(d time.Time) time.Time {
  68. d = d.AddDate(0, 0, -d.Day()+1)
  69. return GetStartDayTime(d)
  70. }
  71. // GetLastDateOfMonth 获取传入的时间所在月份的最后一天,即某月最后一天的0点。如传入time.Now(), 返回当前月份的最后一天0点时间。
  72. func GetLastDateOfMonth(d time.Time) time.Time {
  73. return GetEndDayTime(GetFirstDateOfMonth(d).AddDate(0, 1, -1))
  74. }
  75. // GetStartDayTime 获取某一天的开始时间
  76. func GetStartDayTime(d time.Time) time.Time {
  77. return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, cst)
  78. }
  79. // GetEndDayTime 获取某一天的结束时间
  80. func GetEndDayTime(d time.Time) time.Time {
  81. return GetStartDayTime(d).Add(24 * time.Hour).Add(-time.Second)
  82. }
  83. // GetStartYesterdayTime 获取昨天的起始时间
  84. func GetStartYesterdayTime() time.Time {
  85. d, _ := time.ParseDuration("-24h")
  86. return GetStartDayTime(time.Now().Add(d))
  87. }
  88. // SubInLocationDays 计算两个日期相差的天数
  89. func SubInLocationDays(t1, t2 time.Time) float64 {
  90. t1 = time.Date(t1.Year(), t1.Month(), t1.Day(), 0, 0, 0, 0, cst)
  91. t2 = time.Date(t2.Year(), t2.Month(), t2.Day(), 0, 0, 0, 0, cst)
  92. return math.Abs(t1.Sub(t2).Hours() / 24)
  93. }