我的游戏里有N个时间后才能打开的礼物。大多是2到8小时。当我收到某个角色的礼物时,我会将Ticks
这些相同礼物的模型保存到一个特殊列表中。当玩家离开游戏时,相同的标记会保存到数据库中。进入游戏时,计算差值并显示剩余时间的结果。如果您在 1-3 小时后进入游戏,这个简单的算法就会起作用。但如果你第二天就开始比赛,时间就会变得疯狂。它可以显示还剩 120 小时。或者也许还剩下30分钟,尽管已经过去了10多个小时。我怎样才能摆脱这个错误?
添加礼物的代码:
PresentContract presentContract = new PresentContract();
presentContract.PresentType = battleResultSource.PresentType;
presentContract.ObjId = ObjId;
presentContract.Time = DateTime.Now.AddSeconds(HowManySecondsWillFirstLevelOpeningGift).Ticks;
presentContract.Slot = InternalDetermineFreeSlot(GameClientField.PresentContracts);
presentContract.CostOfOneSecondGift = CharacterConfig.CostOfOneSecondGift;
GameClientField.PresentContracts[presentContract.Slot] = presentContract;
计算当前时间与可能打开礼物的时间之间的差异的代码:
DateTime dateTime = new DateTime(presentContracts.Time);
_presentModels[presentContracts.Slot]._dateTime = dateTime;
TimeSpan timeSpan = _presentModels[presentContracts.Slot]._dateTime.Subtract(DateTime.Now);
尝试计算刻度总和可能不是一个好主意。将当前时间保存到数据库并计算差值。最好使用 UTC 时间。确保在保存并从数据库检索时间后,该时间的时区和时间戳没有更改。还要确保时间是由服务器生成的,而不是由玩家发送的,这样您就可以避免无良玩家的问题。另外,请注意( ) 在显式类型缩小期间
Ticks
可能会导致问题。long
Int64
选择延迟以及 UTC 时区。