admin_backend/util/time.go
2025-07-16 16:37:40 +08:00

112 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package util
import (
"fmt"
"strconv"
"time"
)
func ZeroTimestamp() int64 {
now := time.Now()
midnight := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
return midnight.Unix()
}
func GetHour(ts int64, tz string) int {
loc, _ := time.LoadLocation(tz)
return time.Unix(ts, 0).In(loc).Hour()
}
// 将ISO 8601格式的时间字符串转换为指定时区的时间戳
// timeStr: ISO 8601格式的时间字符串"2025-03-17T16:00:00.000Z"
// timezone: 时区字符串,如:"Asia/Shanghai""America/New_York"留空则使用UTC
func ParseTimeToTimestamp(timeStr string, timezone string) (int64, error) {
// 如果 timeStr 是纯数字,则直接解析为时间戳返回
if ts, err := strconv.ParseInt(timeStr, 10, 64); err == nil {
return ts, nil
}
// 先解析为UTC时间
t, err := time.Parse(time.RFC3339, timeStr)
if err != nil {
return 0, err
}
// 如果没有指定时区直接返回UTC时间戳
if timezone == "" {
return t.Unix(), nil
}
// 加载指定时区
loc, err := time.LoadLocation(timezone)
if err != nil {
return 0, fmt.Errorf("invalid timezone: %v", err)
}
// 将时间转换到指定时区
t = t.In(loc)
return t.Unix(), nil
}
// GetZeroTimestamp 获取指定时区的当天0点时间戳
// timezone: 时区字符串,如:"Asia/Shanghai""America/New_York"留空则使用UTC
// offset: 日期偏移0表示今天-1表示昨天1表示明天以此类推
func GetZeroTimestamp(timezone string, offset int) (int64, error) {
var loc *time.Location
var err error
// 如果没有指定时区使用UTC
if timezone == "" {
loc = time.UTC
} else {
// 加载指定时区
loc, err = time.LoadLocation(timezone)
if err != nil {
return 0, fmt.Errorf("invalid timezone: %v", err)
}
}
// 获取当前时间并转换到指定时区
now := time.Now().In(loc)
// 应用日期偏移
if offset != 0 {
now = now.AddDate(0, 0, offset)
}
// 获取当天0点时间
zero := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, loc)
return zero.Unix(), nil
}
// GetDateStr 获取指定时区的日期字符串
// timezone: 时区字符串,如:"Asia/Shanghai""America/New_York"留空则使用UTC
// offset: 日期偏移0表示今天-1表示昨天1表示明天以此类推
// 返回格式:"2006-01-02"
func GetDateStr(timezone string, offset int) (string, error) {
var loc *time.Location
var err error
// 如果没有指定时区使用UTC
if timezone == "" {
loc = time.UTC
} else {
// 加载指定时区
loc, err = time.LoadLocation(timezone)
if err != nil {
return "", fmt.Errorf("invalid timezone: %v", err)
}
}
// 获取当前时间并转换到指定时区
now := time.Now().In(loc)
// 应用日期偏移
if offset != 0 {
now = now.AddDate(0, 0, offset)
}
// 格式化日期
return now.Format("2006-01-02"), nil
}