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.Unix() } var gt = &GameTime{ Timestamp: timestamp, } if gt.Timestamp == 0 { return gt } util.Unix() 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 }