增加time的函数,crypto的函数
This commit is contained in:
186
tools/time.go
Normal file
186
tools/time.go
Normal file
@@ -0,0 +1,186 @@
|
||||
package tools
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// TimeInfo 详细时间信息结构
|
||||
type TimeInfo struct {
|
||||
UTC string `json:"utc"` // UTC时间
|
||||
Local string `json:"local"` // 用户时区时间
|
||||
Unix int64 `json:"unix"` // Unix时间戳
|
||||
Timezone string `json:"timezone"` // 时区名称
|
||||
Offset int `json:"offset"` // 时区偏移量(小时)
|
||||
RFC3339 string `json:"rfc3339"` // RFC3339格式
|
||||
DateTime string `json:"datetime"` // 日期时间格式
|
||||
Date string `json:"date"` // 日期格式
|
||||
Time string `json:"time"` // 时间格式
|
||||
}
|
||||
|
||||
// GetTimestamp 获取当前时间戳(秒)
|
||||
func GetTimestamp() int64 {
|
||||
return time.Now().Unix()
|
||||
}
|
||||
|
||||
// GetMillisTimestamp 获取当前时间戳(毫秒)
|
||||
func GetMillisTimestamp() int64 {
|
||||
return time.Now().UnixMilli()
|
||||
}
|
||||
|
||||
// FormatTimeWithLayout 格式化时间(自定义格式)
|
||||
func FormatTimeWithLayout(t time.Time, layout string) string {
|
||||
if layout == "" {
|
||||
layout = "2006-01-02 15:04:05"
|
||||
}
|
||||
return t.Format(layout)
|
||||
}
|
||||
|
||||
// ParseTime 解析时间字符串
|
||||
func ParseTime(timeStr, layout string) (time.Time, error) {
|
||||
if layout == "" {
|
||||
layout = "2006-01-02 15:04:05"
|
||||
}
|
||||
return time.Parse(layout, timeStr)
|
||||
}
|
||||
|
||||
// GetCurrentTime 获取当前时间字符串
|
||||
func GetCurrentTime() string {
|
||||
return FormatTimeWithLayout(time.Now(), "")
|
||||
}
|
||||
|
||||
// 注意:GetBeginOfDay、GetEndOfDay 已在 datetime.go 中实现为 StartOfDay、EndOfDay
|
||||
// datetime.go 中的方法支持时区参数,功能更强大,建议使用 datetime.go 中的方法
|
||||
|
||||
// GetBeginOfWeek 获取某周的开始时间(周一)
|
||||
func GetBeginOfWeek(t time.Time) time.Time {
|
||||
weekday := t.Weekday()
|
||||
if weekday == time.Sunday {
|
||||
weekday = 7
|
||||
}
|
||||
// 使用 datetime.go 中的 StartOfDay 方法(需要时区,这里使用时间对象本身的时区)
|
||||
beginDay := t.AddDate(0, 0, int(1-weekday))
|
||||
return time.Date(beginDay.Year(), beginDay.Month(), beginDay.Day(), 0, 0, 0, 0, beginDay.Location())
|
||||
}
|
||||
|
||||
// GetEndOfWeek 获取某周的结束时间(周日)
|
||||
func GetEndOfWeek(t time.Time) time.Time {
|
||||
beginOfWeek := GetBeginOfWeek(t)
|
||||
endDay := beginOfWeek.AddDate(0, 0, 6)
|
||||
return time.Date(endDay.Year(), endDay.Month(), endDay.Day(), 23, 59, 59, 999999999, endDay.Location())
|
||||
}
|
||||
|
||||
// 注意:GetBeginOfMonth、GetEndOfMonth、GetBeginOfYear、GetEndOfYear 已在 datetime.go 中实现
|
||||
// datetime.go 中的方法(StartOfMonth、EndOfMonth、StartOfYear、EndOfYear)支持时区参数,功能更强大
|
||||
// 建议使用 datetime.go 中的方法
|
||||
|
||||
// AddHours 增加小时数
|
||||
func AddHours(t time.Time, hours int) time.Time {
|
||||
return t.Add(time.Duration(hours) * time.Hour)
|
||||
}
|
||||
|
||||
// AddMinutes 增加分钟数
|
||||
func AddMinutes(t time.Time, minutes int) time.Time {
|
||||
return t.Add(time.Duration(minutes) * time.Minute)
|
||||
}
|
||||
|
||||
// 注意:DiffDays、DiffHours、DiffMinutes、DiffSeconds 方法已在 datetime.go 中实现
|
||||
// 请使用 datetime.go 中的方法,它们支持更精确的计算和统一的返回类型
|
||||
|
||||
// IsToday 判断是否为今天
|
||||
func IsToday(t time.Time) bool {
|
||||
now := time.Now()
|
||||
tBegin := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
|
||||
nowBegin := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
|
||||
return tBegin.Equal(nowBegin)
|
||||
}
|
||||
|
||||
// GenerateTimeInfoWithTimezone 生成详细时间信息(指定时区)
|
||||
func GenerateTimeInfoWithTimezone(t time.Time, timezone string) TimeInfo {
|
||||
// 加载时区
|
||||
loc, err := time.LoadLocation(timezone)
|
||||
if err != nil {
|
||||
loc = time.UTC
|
||||
timezone = "UTC"
|
||||
}
|
||||
|
||||
// 转换为指定时区时间
|
||||
localTime := t.In(loc)
|
||||
|
||||
// 计算时区偏移量
|
||||
_, offset := localTime.Zone()
|
||||
offsetHours := offset / 3600
|
||||
|
||||
// 预先计算格式化结果,避免重复调用
|
||||
utcRFC3339 := t.UTC().Format(time.RFC3339)
|
||||
localRFC3339 := localTime.Format(time.RFC3339)
|
||||
localDateTime := localTime.Format("2006-01-02 15:04:05")
|
||||
localDate := localTime.Format("2006-01-02")
|
||||
localTimeOnly := localTime.Format("15:04:05")
|
||||
|
||||
return TimeInfo{
|
||||
UTC: utcRFC3339,
|
||||
Local: localRFC3339,
|
||||
Unix: t.Unix(),
|
||||
Timezone: timezone,
|
||||
Offset: offsetHours,
|
||||
RFC3339: localRFC3339,
|
||||
DateTime: localDateTime,
|
||||
Date: localDate,
|
||||
Time: localTimeOnly,
|
||||
}
|
||||
}
|
||||
|
||||
// GetUTCTimestamp 获取UTC时间戳
|
||||
func GetUTCTimestamp() int64 {
|
||||
return time.Now().UTC().Unix()
|
||||
}
|
||||
|
||||
// GetUTCTimestampFromTime 从指定时间获取UTC时间戳
|
||||
func GetUTCTimestampFromTime(t time.Time) int64 {
|
||||
return t.UTC().Unix()
|
||||
}
|
||||
|
||||
// FormatTimeUTC 格式化时间为UTC字符串(ISO 8601格式)
|
||||
func FormatTimeUTC(t time.Time) string {
|
||||
return t.UTC().Format(time.RFC3339)
|
||||
}
|
||||
|
||||
// IsYesterday 判断是否为昨天
|
||||
func IsYesterday(t time.Time) bool {
|
||||
yesterday := time.Now().AddDate(0, 0, -1)
|
||||
tBegin := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
|
||||
yesterdayBegin := time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 0, 0, 0, 0, yesterday.Location())
|
||||
return tBegin.Equal(yesterdayBegin)
|
||||
}
|
||||
|
||||
// IsTomorrow 判断是否为明天
|
||||
func IsTomorrow(t time.Time) bool {
|
||||
tomorrow := time.Now().AddDate(0, 0, 1)
|
||||
tBegin := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
|
||||
tomorrowBegin := time.Date(tomorrow.Year(), tomorrow.Month(), tomorrow.Day(), 0, 0, 0, 0, tomorrow.Location())
|
||||
return tBegin.Equal(tomorrowBegin)
|
||||
}
|
||||
|
||||
// GenerateTimeInfoFromContext 从gin.Context中获取用户时区并生成时间信息
|
||||
func GenerateTimeInfoFromContext(t time.Time, c interface{}) TimeInfo {
|
||||
// 尝试从context中获取时区
|
||||
timezone := ""
|
||||
|
||||
// 如果传入的是gin.Context,尝试获取时区
|
||||
if ginCtx, ok := c.(interface {
|
||||
Get(key string) (value interface{}, exists bool)
|
||||
}); ok {
|
||||
if tz, exists := ginCtx.Get("user_timezone"); exists {
|
||||
if tzStr, ok := tz.(string); ok && tzStr != "" {
|
||||
timezone = tzStr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 如果没有获取到时区,使用默认时区(东8区)
|
||||
if timezone == "" {
|
||||
timezone = "Asia/Shanghai"
|
||||
}
|
||||
|
||||
return GenerateTimeInfoWithTimezone(t, timezone)
|
||||
}
|
||||
Reference in New Issue
Block a user