package utils import ( "fmt" "time" ) // FormatTime 格式化时间为字符串 func FormatTime(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) } // GetTimeAgo 获取相对时间描述 func GetTimeAgo(t time.Time) string { now := time.Now() diff := now.Sub(t) if diff < time.Minute { return "刚刚" } if diff < time.Hour { minutes := int(diff.Minutes()) return fmt.Sprintf("%d分钟前", minutes) } if diff < 24*time.Hour { hours := int(diff.Hours()) return fmt.Sprintf("%d小时前", hours) } if diff < 30*24*time.Hour { days := int(diff.Hours() / 24) return fmt.Sprintf("%d天前", days) } if diff < 365*24*time.Hour { months := int(diff.Hours() / (24 * 30)) return fmt.Sprintf("%d个月前", months) } years := int(diff.Hours() / (24 * 365)) return fmt.Sprintf("%d年前", years) } // IsToday 检查时间是否为今天 func IsToday(t time.Time) bool { now := time.Now() return t.Year() == now.Year() && t.YearDay() == now.YearDay() } // IsThisWeek 检查时间是否为本周 func IsThisWeek(t time.Time) bool { now := time.Now() year, week := now.ISOWeek() tYear, tWeek := t.ISOWeek() return year == tYear && week == tWeek } // IsThisMonth 检查时间是否为本月 func IsThisMonth(t time.Time) bool { now := time.Now() return t.Year() == now.Year() && t.Month() == now.Month() } // IsThisYear 检查时间是否为今年 func IsThisYear(t time.Time) bool { now := time.Now() return t.Year() == now.Year() } // GetWeekRange 获取本周的开始和结束时间 func GetWeekRange(t time.Time) (start, end time.Time) { // 获取周一作为周开始 weekday := int(t.Weekday()) if weekday == 0 { weekday = 7 // 周日为7 } start = t.AddDate(0, 0, -(weekday-1)) start = time.Date(start.Year(), start.Month(), start.Day(), 0, 0, 0, 0, start.Location()) end = start.AddDate(0, 0, 6) end = time.Date(end.Year(), end.Month(), end.Day(), 23, 59, 59, 999999999, end.Location()) return start, end } // GetMonthRange 获取本月的开始和结束时间 func GetMonthRange(t time.Time) (start, end time.Time) { start = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location()) end = start.AddDate(0, 1, -1) end = time.Date(end.Year(), end.Month(), end.Day(), 23, 59, 59, 999999999, end.Location()) return start, end } // GetYearRange 获取本年的开始和结束时间 func GetYearRange(t time.Time) (start, end time.Time) { start = time.Date(t.Year(), 1, 1, 0, 0, 0, 0, t.Location()) end = time.Date(t.Year(), 12, 31, 23, 59, 59, 999999999, t.Location()) return start, end } // Timestamp 获取当前时间戳(秒) func Timestamp() int64 { return time.Now().Unix() } // TimestampMilli 获取当前时间戳(毫秒) func TimestampMilli() int64 { return time.Now().UnixNano() / 1e6 } // FromTimestamp 从时间戳创建时间对象 func FromTimestamp(timestamp int64) time.Time { return time.Unix(timestamp, 0) } // FromTimestampMilli 从毫秒时间戳创建时间对象 func FromTimestampMilli(timestamp int64) time.Time { return time.Unix(0, timestamp*1e6) } // FormatDuration 格式化持续时间 func FormatDuration(d time.Duration) string { if d < time.Minute { return fmt.Sprintf("%.0f秒", d.Seconds()) } if d < time.Hour { return fmt.Sprintf("%.0f分钟", d.Minutes()) } if d < 24*time.Hour { return fmt.Sprintf("%.1f小时", d.Hours()) } days := d.Hours() / 24 return fmt.Sprintf("%.1f天", days) }