go_dreamfactory/utils/time.go
2023-11-17 09:43:43 +08:00

204 lines
5.0 KiB
Go

package utils
import (
"fmt"
"go_dreamfactory/sys/configure"
"math"
"time"
"github.com/jinzhu/now"
)
// 判断时间点处于今天
func IsToday(d int64) bool {
tt := time.Unix(d, 0)
now := configure.Now()
return tt.Year() == now.Year() && tt.Month() == now.Month() && tt.Day() == now.Day()
}
func IsNextToday(d int64) bool {
d += 24 * 3600
tt := time.Unix(d, 0)
now := configure.Now()
return tt.Year() == now.Year() && tt.Month() == now.Month() && tt.Day() == now.Day()
}
// 判断是否是出于同一周
func IsSameWeek(d int64) bool {
// 将时间戳转换为 time.Time 类型
time1 := time.Unix(d, 0)
time2 := configure.Now()
// 获取时间戳所属的年份和周数
year1, week1 := time1.ISOWeek()
year2, week2 := time2.ISOWeek()
// 判断是否同一年同一周
if year1 == year2 && week1 == week2 {
return true
} else {
return false
}
}
// 判断是否大于1周
func IsAfterWeek(d int64) bool {
tt := time.Unix(d, 0)
nowt := configure.Now()
if !tt.Before(nowt) {
return false
}
at := now.With(tt).AddDate(0, 0, 7).Unix()
return nowt.Unix() >= at
}
// 是否今日首次
func IsFirstTody(timestamp int64) bool {
now := configure.Now()
if timestamp == 0 || timestamp > now.Unix() {
return false
}
tt := time.Unix(timestamp, 0)
if !IsToday(timestamp) {
if tt.Before(now) {
return true
}
}
return false
}
// 获取当前时间戳下一天0点时间戳
func GetZeroTime(curTime int64) int64 {
currentTime := time.Unix(curTime, 0)
startTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location())
return startTime.Unix() + 86400 //3600*24
}
func IsYestoday(timestamp int64) bool {
tt := time.Unix(timestamp, 0)
yesTime := configure.Now().AddDate(0, 0, -1)
return tt.Year() == yesTime.Year() && tt.Month() == yesTime.Month() && tt.Day() == yesTime.Day()
}
// 确定换算规则 现实1H = 虚拟4H
// 计算:根据开服时间为起始时间,计算当前时间与起始时间的差值,计算虚拟当前时间
func MatrixingHour(beginTime string) (t time.Time) {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
return
}
myConfig := &now.Config{
WeekStartDay: time.Monday,
TimeLocation: location,
TimeFormats: []string{"2006-01-02 15:04:05"},
}
serverStartTime, _ := myConfig.Parse(beginTime)
n := configure.Now()
timeSub := n.Sub(serverStartTime)
hourSub := timeSub.Hours() * 2
hh, _ := time.ParseDuration("1h")
fmt.Println(hourSub, math.Ceil(hourSub))
t2 := serverStartTime.Add(hh * time.Duration(math.Ceil(hourSub)))
fmt.Println(t2)
return
}
// 时间戳格式化字符串日期
func FormatStr(timestamp int64, format string) string {
if format == "" {
format = "2006-01-02 15:04:05"
}
return time.Unix(timestamp, 0).Format(format)
}
func AddHour(hour int) time.Time {
return configure.Now().Add(time.Duration(hour) * time.Hour)
}
// CD
func IsInCDHour(cdTime int64) bool {
if cdTime == 0 {
return false
}
return configure.Now().Unix() < cdTime
}
// 获取本月的开始和结束的时间戳
func GetMonthStart() int64 {
t := configure.Now()
monthStartDay := t.AddDate(0, 0, -t.Day()+1)
monthStartTime := time.Date(monthStartDay.Year(), monthStartDay.Month(), monthStartDay.Day(), 0, 0, 0, 0, t.Location())
_d1 := monthStartTime.Unix()
return _d1
}
// 获取本月的开始和结束的时间戳
func GetMonthStartEnd() (int64, int64) {
t := configure.Now()
monthStartDay := t.AddDate(0, 0, -t.Day()+1)
monthStartTime := time.Date(monthStartDay.Year(), monthStartDay.Month(), monthStartDay.Day(), 0, 0, 0, 0, t.Location())
monthEndDay := monthStartTime.AddDate(0, 1, -1)
monthEndTime := time.Date(monthEndDay.Year(), monthEndDay.Month(), monthEndDay.Day(), 23, 59, 59, 0, t.Location())
_d1 := monthStartTime.Unix()
_d2 := monthEndTime.Unix()
fmt.Printf("%d,%d", _d1, _d2)
return _d1, _d2
}
// 获取今天零点时间戳
func GetTodayZeroTime(curTime int64) int64 {
currentTime := time.Unix(curTime, 0)
startTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location())
return startTime.Unix()
}
// 计算自然天数
func DiffDays(t1, t2 int64) int {
if t1 == t2 {
return -1
}
if t1 > t2 {
t1, t2 = t2, t1
}
secOfDay := 3600 * 24
diffDays := 0
secDiff := t2 - t1
if secDiff > int64(secOfDay) {
tmpDays := int(secDiff / int64(secOfDay))
t1 += int64(tmpDays) * int64(secOfDay)
diffDays += tmpDays
}
st := time.Unix(t1, 0)
et := time.Unix(t2, 0)
dateformat := "20060102"
if st.Format(dateformat) != et.Format(dateformat) {
diffDays += 1
}
return diffDays
}
func WeekIntervalTime() (endTime int64) {
now := time.Now()
offset := int(time.Monday - now.Weekday())
//周日做特殊判断 因为time.Monday = 0
if offset > 0 {
offset = -6
}
year, month, day := now.Date()
thisWeek := time.Date(year, month, day, 0, 0, 0, 0, time.Local)
//startTime = thisWeek.AddDate(0, 0, offset+7*week).Unix()
endTime = thisWeek.AddDate(0, 0, offset+7).Unix()
return endTime
}