timeutil.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package timeutil
  2. import (
  3. "math"
  4. "net/http"
  5. "time"
  6. )
  7. var (
  8. cst *time.Location
  9. )
  10. // CSTLayout China Standard Time Layout
  11. const CSTLayout = "2006-01-02 15:04:05"
  12. func init() {
  13. var err error
  14. if cst, err = time.LoadLocation("Asia/Shanghai"); err != nil {
  15. panic(err)
  16. }
  17. // 默认设置为中国时区
  18. time.Local = cst
  19. }
  20. // RFC3339ToCSTLayout convert rfc3339 value to china standard time layout
  21. // 2020-11-08T08:18:46+08:00 => 2020-11-08 08:18:46
  22. func RFC3339ToCSTLayout(value string) (string, error) {
  23. ts, err := time.Parse(time.RFC3339, value)
  24. if err != nil {
  25. return "", err
  26. }
  27. return ts.In(cst).Format(CSTLayout), nil
  28. }
  29. // CSTLayoutString 格式化时间
  30. // 返回 "2006-01-02 15:04:05" 格式的时间
  31. func CSTLayoutString() string {
  32. ts := time.Now()
  33. return ts.In(cst).Format(CSTLayout)
  34. }
  35. // ParseCSTInLocation 格式化时间
  36. func ParseCSTInLocation(date string) (time.Time, error) {
  37. return time.ParseInLocation(CSTLayout, date, cst)
  38. }
  39. // CSTLayoutStringToUnix 返回 unix 时间戳
  40. // 2020-01-24 21:11:11 => 1579871471
  41. func CSTLayoutStringToUnix(cstLayoutString string) (int64, error) {
  42. stamp, err := time.ParseInLocation(CSTLayout, cstLayoutString, cst)
  43. if err != nil {
  44. return 0, err
  45. }
  46. return stamp.Unix(), nil
  47. }
  48. // GMTLayoutString 格式化时间
  49. // 返回 "Mon, 02 Jan 2006 15:04:05 GMT" 格式的时间
  50. func GMTLayoutString() string {
  51. return time.Now().In(cst).Format(http.TimeFormat)
  52. }
  53. // ParseGMTInLocation 格式化时间
  54. func ParseGMTInLocation(date string) (time.Time, error) {
  55. return time.ParseInLocation(http.TimeFormat, date, cst)
  56. }
  57. // SubInLocation 计算时间差
  58. func SubInLocation(ts time.Time) float64 {
  59. return math.Abs(time.Now().In(cst).Sub(ts).Seconds())
  60. }