104 lines
1.9 KiB
Go
104 lines
1.9 KiB
Go
package logic
|
|
|
|
import (
|
|
"github.com/oylshe1314/framework/util"
|
|
)
|
|
|
|
const GameDailyResetHour int64 = 0
|
|
const GameDailyResetTime int64 = 3600 * GameDailyResetHour
|
|
|
|
type GameTime struct {
|
|
Timestamp int64
|
|
|
|
Days int64
|
|
Weeks int64
|
|
Months int64
|
|
Years int64
|
|
}
|
|
|
|
func NewGameTime(timestamp int64) *GameTime {
|
|
if timestamp < 0 {
|
|
timestamp = util.NowUnix()
|
|
}
|
|
|
|
var gt = &GameTime{
|
|
Timestamp: timestamp,
|
|
}
|
|
|
|
if gt.Timestamp == 0 {
|
|
return gt
|
|
}
|
|
|
|
util.NowUnix()
|
|
|
|
gt.Days, gt.Weeks, gt.Months, gt.Years = absDate(gt.Timestamp)
|
|
return gt
|
|
}
|
|
|
|
func leapYear(years int64) bool {
|
|
return years%4 == 0 && (years%100 != 0 || years%400 == 0)
|
|
}
|
|
|
|
const (
|
|
endJanuary int64 = 31
|
|
endFebruary = endJanuary + 28
|
|
endMarch = endFebruary + 31
|
|
endApril = endMarch + 30
|
|
endMay = endApril + 31
|
|
endJune = endMay + 30
|
|
endJuly = endJune + 31
|
|
endAugust = endJuly + 31
|
|
endSeptember = endAugust + 30
|
|
endOctober = endSeptember + 31
|
|
endNovember = endOctober + 30
|
|
endDecember = endNovember + 31
|
|
)
|
|
|
|
var monthlyBefore = [...]int64{
|
|
0,
|
|
endJanuary,
|
|
endFebruary,
|
|
endMarch,
|
|
endApril,
|
|
endMay,
|
|
endJune,
|
|
endJuly,
|
|
endAugust,
|
|
endSeptember,
|
|
endOctober,
|
|
endNovember,
|
|
endDecember,
|
|
}
|
|
|
|
func absDate(timestamp int64) (days int64, weeks int64, months int64, years int64) {
|
|
timestamp -= GameDailyResetTime
|
|
days = (timestamp - (timestamp+util.UTC8TimezoneOffset)%util.DayTotalSeconds + util.UTC8TimezoneOffset) / util.DayTotalSeconds
|
|
weeks = (days + 3) / 7
|
|
|
|
var leapYears = (days + 730) / 1461
|
|
|
|
years = (days - leapYears) / 365
|
|
|
|
var yearDays = days - (365*years + leapYears)
|
|
|
|
months = years * 12
|
|
|
|
if yearDays < endJanuary {
|
|
months += 1
|
|
return
|
|
}
|
|
|
|
if leapYear(years) {
|
|
yearDays--
|
|
}
|
|
|
|
var month = yearDays / 31
|
|
var end = monthlyBefore[month+1]
|
|
if yearDays >= end {
|
|
month++
|
|
}
|
|
|
|
months += month
|
|
return
|
|
}
|