ToUnixTimeMilliseconds强制转UTC导致Unix时间戳跨环境计算错误如何处理
问题根因
你的代码问题出在DateTimeOffset.Date属性的行为:该属性返回的是服务器本地时区对应日期的零点DateTime值,你后续仅手动指定DateTimeKind.Utc只是修改了时间的类型标记,没有修正时间值本身的时区偏移误差。你本地运行正常是因为本地时区和你的预期时区一致,Azure服务器时区和你本地不一致,所以出现了2小时的误差(你给出的两个返回结果差值为7200秒,刚好对应2小时的时区偏移)。
修复方案
全程使用UTC偏移量显式构造零点时间,完全不依赖服务器的时区配置:
public static long BeginningOfDay(long date) { // 输入时间戳转UTC时间的DateTimeOffset DateTimeOffset utcTime = DateTimeOffset.FromUnixTimeMilliseconds(date); // 显式构造UTC时区当日零点的DateTimeOffset,不受服务器时区影响 DateTimeOffset utcBeginOfDay = new DateTimeOffset(utcTime.Year, utcTime.Month, utcTime.Day, 0, 0, 0, TimeSpan.Zero); // 转换为时间戳无额外偏移转换 return utcBeginOfDay.ToUnixTimeMilliseconds(); }
验证
传入你给出的参数后,无论部署到任何时区的服务器,都会返回预期的正确结果。
内容的提问来源于stack exchange,提问作者Waad Sulaiman
相关产品推荐
相关产品推荐

