Files
2026-10-27 16:44:55 +08:00

287 lines
6.8 KiB
Go

package utils
import (
"fmt"
"time"
"videoweb/pub/pubdef"
)
var (
LocBJ, _ = time.LoadLocation("Asia/Shanghai")
)
func init() {
time.Local = LocBJ
}
func Now() time.Time {
return time.Now().Local()
}
func NowMillisecond() int64 {
return Now().UnixNano() / int64(time.Millisecond)
}
func BeginOfToday() time.Time {
t := Now()
return BeginOfTime(t)
}
func BeginOfTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year, month, day, 0, 0, 0, 0, t.Location())
}
func GetNextMonthTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year, month+1, day, 0, 0, 0, 0, t.Location())
}
func GetNextQuarterTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year, month+3, day, 0, 0, 0, 0, t.Location())
}
func GetNextYearTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year+1, month, day, 0, 0, 0, 0, t.Location())
}
func GetForeverTime() time.Time {
t := time.Now()
year, month, day := t.Date()
return time.Date(year+999, month, day, 0, 0, 0, 0, t.Location())
}
func IsoWeek() string {
year, week := time.Now().ISOWeek()
return fmt.Sprintf("%d%02d", year, week)
}
// Deprecated
func EndOfToday() time.Time {
t := Now()
return EndOfTime(t)
}
func EndOfTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year, month, day, 23, 59, 59, 0, t.Location())
}
func GetDateString(t time.Time) string {
return t.In(LocBJ).Format(pubdef.DateISO)
}
func GetTodayDate(now time.Time) string {
return GetDateString(now.In(time.Local))
}
func GetYesterdayDate(now time.Time) string {
return GetDateString(now.Local().AddDate(0, 0, -1))
}
func GetDayBeforeYesterdayDate(now time.Time) string {
return GetDateString(now.Local().AddDate(0, 0, -2))
}
func GetDayRange(t time.Time) (dayStart time.Time, dayEnd time.Time) {
dayStart = BeginOfTime(t)
dayEnd = EndOfTime(t)
return
}
// GetDayRangeByDate 返回一天的开始和结束时间, 00:00:00 - 23:59:59
func GetDayRangeByDate(date string) (dayStart time.Time, dayEnd time.Time, err error) {
var d time.Time
d, err = time.ParseInLocation(pubdef.DateISO, date, LocBJ)
if err != nil {
return
}
dayStart, dayEnd = GetDayRange(d)
return
}
func GetDayEnd(date string) time.Time {
d, _ := time.ParseInLocation(pubdef.DateISO, date, LocBJ)
return EndOfTime(d)
}
func GetDayBegin(date string) time.Time {
d, _ := time.ParseInLocation(pubdef.DateISO, date, LocBJ)
return BeginOfTime(d)
}
func GetDayEndByTime(date string) time.Time {
d, _ := time.ParseInLocation(pubdef.TimeISO, date, LocBJ)
return EndOfTime(d)
}
func GetDayBeginByTime(date string) time.Time {
d, _ := time.ParseInLocation(pubdef.TimeISO, date, LocBJ)
return BeginOfTime(d)
}
func BeginWithThisMonth() time.Time {
t := Now()
year, month, _ := t.Date()
return time.Date(year, month, 1, 0, 0, 0, 0, t.Location())
}
func BeginOfMonth(t time.Time) time.Time {
year, month, _ := t.In(time.Local).Date()
return time.Date(year, month, 1, 0, 0, 0, 0, t.Location())
}
func EndOfMonth(t time.Time) time.Time {
return BeginOfMonth(t).AddDate(0, 1, 0).Add(-time.Nanosecond)
}
func EndOfLastMonth(t time.Time) time.Time {
return BeginOfMonth(t).Add(-time.Nanosecond)
}
func EndOfLastMonthDate(t time.Time) string {
return GetDateString(EndOfLastMonth(t))
}
func EndOfLastWeek(t time.Time) time.Time {
return BeginOfWeekByTime(t).Add(-time.Nanosecond)
}
func EndOfLastWeekDate(t time.Time) string {
return GetDateString(EndOfLastWeek(t))
}
// Deprecated
func BeginOfWeek() time.Time {
return BeginOfWeekByTime(Now())
}
func WeekDateRange(t time.Time) (string, string) {
b := BeginOfWeekByTime(t)
e := EndOfWeekByTime(t)
return GetDateString(b), GetDateString(e)
}
func MonthDateRange(t time.Time) (string, string) {
b := BeginOfMonth(t)
e := EndOfMonth(t)
return GetDateString(b), GetDateString(e)
}
func BeginOfWeekByTime(t time.Time) time.Time {
bt := BeginOfTime(t)
weekday := int(t.Weekday())
weekStartDayInt := int(time.Monday)
if weekday < weekStartDayInt {
weekday = weekday + 7 - weekStartDayInt
} else {
weekday = weekday - weekStartDayInt
}
return bt.AddDate(0, 0, -weekday)
}
func EndOfWeekByTime(t time.Time) time.Time {
return BeginOfWeekByTime(t).AddDate(0, 0, 7).Add(-time.Nanosecond)
}
func BeginTodayMillsecond() int64 {
return BeginOfToday().UnixNano() / int64(time.Millisecond)
}
// ServerCurrMillisecond 获得时间毫秒数 13位
func ServerCurrMillisecond(t time.Time) int64 {
return t.UnixNano() / 1000000
}
func BeginWithTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year, month, day, 0, 0, 0, 0, t.Location())
}
func EndWithTime(t time.Time) time.Time {
year, month, day := t.Date()
return time.Date(year, month, day, 23, 59, 59, 0, t.Location())
}
func IsToday(t time.Time) bool {
if t.IsZero() {
return false
}
today := Now()
return t.Year() == today.Year() &&
t.Month() == today.Month() &&
t.Day() == today.Day()
}
func IsSameYearAndMonth(t1, t2 time.Time) bool {
return t1.Year() == t2.Year() &&
t1.Month() == t2.Month()
}
// 获取月的第一天
func GetFirstDateOfMonth(d time.Time) time.Time {
d = d.AddDate(0, 0, -d.Day()+1)
return GetZeroTime(d)
}
// 获取月的最后一天
func GetLastDateOfMonth(d time.Time) time.Time {
return GetFirstDateOfMonth(d).AddDate(0, 1, -1)
}
// 获取周的星期一(星期一~星期日)
func GetMondayOfWeek(d time.Time) time.Time {
offset := (int(d.Weekday()) + 6) % 7
d = d.AddDate(0, 0, -offset)
return GetZeroTime(d)
}
// 获取周的星期日(星期一~星期日)
func GetSundayOfWeek(d time.Time) time.Time {
offset := 6 - (int(d.Weekday())+6)%7
d = d.AddDate(0, 0, offset)
return GetZeroTime(d)
}
// 获取某一天的0点时间
func GetZeroTime(d time.Time) time.Time {
return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, d.Location())
}
// 获取当前整点时间
func GetWholeTime(d time.Time) time.Time {
return time.Date(d.Year(), d.Month(), d.Day(), d.Hour(), 0, 0, 0, d.Location())
}
func MustParseTime(s string) time.Time {
layouts := []string{
time.RFC3339,
pubdef.DateISO,
pubdef.TimeISO,
}
for _, layout := range layouts {
t, err := time.ParseInLocation(layout, s, time.Local)
if err != nil {
continue
}
return t
}
panic(fmt.Errorf("cannot parse %s as time.Time", s))
}
// 查看两个时间差了多少天,差一秒都算一天
func TimeSub(t1, t2 time.Time) int64 {
t1 = time.Date(t1.Year(), t1.Month(), t1.Day(), 0, 0, 0, 0, time.Local)
t2 = time.Date(t2.Year(), t2.Month(), t2.Day(), 0, 0, 0, 0, time.Local)
return int64(t1.Sub(t2).Hours() / 24)
}
func RecentMinute(tim time.Time, scaleMinute int64) time.Time {
minute := int64(tim.Minute())
lave := minute % scaleMinute
formatMinute := minute - lave
return time.Date(tim.Year(), tim.Month(), tim.Day(), tim.Hour(), int(formatMinute), 0, 0, tim.Location())
}