102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package timeutil
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
cst *time.Location
|
|
)
|
|
|
|
// CSTLayout China Standard Time Layout
|
|
const CSTLayout = "2006-01-02 15:04:05"
|
|
|
|
func init() {
|
|
var err error
|
|
if cst, err = time.LoadLocation("Asia/Shanghai"); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// 默认设置为中国时区
|
|
time.Local = cst
|
|
}
|
|
|
|
// RFC3339ToCSTLayout convert rfc3339 value to china standard time layout
|
|
// 2020-11-08T08:18:46+08:00 => 2020-11-08 08:18:46
|
|
func RFC3339ToCSTLayout(value string) (string, error) {
|
|
ts, err := time.Parse(time.RFC3339, value)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return ts.In(cst).Format(CSTLayout), nil
|
|
}
|
|
|
|
// CSTLayoutString 格式化时间
|
|
// 返回 "2006-01-02 15:04:05" 格式的时间
|
|
func CSTLayoutString() string {
|
|
ts := time.Now()
|
|
return ts.In(cst).Format(CSTLayout)
|
|
}
|
|
|
|
// ParseCSTInLocation 格式化时间
|
|
func ParseCSTInLocation(date string) (time.Time, error) {
|
|
return time.ParseInLocation(CSTLayout, date, cst)
|
|
}
|
|
|
|
// ParseHMInLocation 格式化时间
|
|
func ParseHMInLocation(date string) (time.Time, error) {
|
|
return time.ParseInLocation("15:04", date, cst)
|
|
}
|
|
|
|
// CSTLayoutStringToUnix 返回 unix 时间戳
|
|
// 2020-01-24 21:11:11 => 1579871471
|
|
func CSTLayoutStringToUnix(cstLayoutString string) (int64, error) {
|
|
stamp, err := time.ParseInLocation(CSTLayout, cstLayoutString, cst)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return stamp.Unix(), nil
|
|
}
|
|
|
|
// GMTLayoutString 格式化时间
|
|
// 返回 "Mon, 02 Jan 2006 15:04:05 GMT" 格式的时间
|
|
func GMTLayoutString() string {
|
|
return time.Now().In(cst).Format(http.TimeFormat)
|
|
}
|
|
|
|
// ParseGMTInLocation 格式化时间
|
|
func ParseGMTInLocation(date string) (time.Time, error) {
|
|
return time.ParseInLocation(http.TimeFormat, date, cst)
|
|
}
|
|
|
|
// SubInLocation 计算时间差
|
|
func SubInLocation(ts time.Time) float64 {
|
|
return math.Abs(time.Now().In(cst).Sub(ts).Seconds())
|
|
}
|
|
|
|
// FriendlyTime 返回一个友好的时间格式
|
|
func FriendlyTime(t time.Time) string {
|
|
now := time.Now()
|
|
diff := now.Sub(t)
|
|
|
|
// 计算差异的分钟数
|
|
minutes := int(diff.Minutes())
|
|
|
|
switch {
|
|
case minutes < 1:
|
|
return "刚刚"
|
|
case minutes < 60:
|
|
return fmt.Sprintf("%d分钟前", minutes)
|
|
case minutes < 1440: // 一天的分钟数
|
|
hours := minutes / 60
|
|
return fmt.Sprintf("%d小时前", hours)
|
|
default:
|
|
// 如果超过一天,可以返回更详细的日期格式
|
|
return t.Format("2006-01-02 15:04")
|
|
}
|
|
}
|