C#如何将毫秒时间戳转换为UTC DateTime 本地转UTC时间偏差问题解决
问题解决方案
核心问题说明
- 你写的毫秒转DateTimeOffset的辅助类逻辑本身没有错误,返回的已经是UTC时间(偏移量为+00:00),不需要额外调用
ToUniversalTime()或者取UtcDateTime重复处理 - 出现断言失败和时间偏差主要有两个原因:
ToString()方法默认使用当前系统的区域配置输出,日期格式、12/24小时制都会和你写死的预期格式不匹配,哪怕时间值正确也会断言失败- 你注释标注的
//2021-07-22 22:00:00是本地时区时间,不是UTC时间,实际1626987600000对应的UTC时间为2021-07-22 19:00:00,如果你预期的UTC时间是22点,对应的毫秒戳应该是1626998400000
- 如果你拿到的毫秒戳本身是本地时间对应的时间戳,需要先指定本地时区偏移再转UTC。
代码修改方案
调整后的测试类代码
using System.Globalization; [Fact] public void DateTimeCalculation_MustTakeDateTimeParameter_InMilliSecond() { //Arrange:预期UTC时间为2021-07-22 22:00:00对应的正确毫秒戳 long startDateTimeUtc = 1626998400000; //Act DateTimeOffset calculatedTimeOffset = DateTimeCalculationHelper.DateTimeCalculation(startDateTimeUtc); //Assert:指定固定格式化字符串+固定区域,避免系统配置影响输出结果 string actual = calculatedTimeOffset.ToString("dd/MM/yyyy hh:mm:ss tt +00:00", CultureInfo.InvariantCulture); string expected = "22/07/2021 10:00:00 PM +00:00"; Assert.Equal(expected, actual); }
原辅助类无需修改(UTC时间戳转UTC DateTimeOffset逻辑正确)
public static class DateTimeCalculationHelper { public static DateTimeOffset DateTimeCalculation(long milSec) { DateTimeOffset epochTime = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero); return epochTime.AddMilliseconds(milSec); } }
如果你拿到的毫秒戳是本地时间对应的戳,新增转换方法如下
public static class DateTimeCalculationHelper { // 原有方法保留,新增本地时间戳转UTC方法 public static DateTimeOffset LocalMilliSecToUtc(long localMilSec) { // 按本地时区初始化纪元时间 DateTimeOffset epochLocal = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeZoneInfo.Local.BaseUtcOffset); // 叠加毫秒后转UTC return epochLocal.AddMilliseconds(localMilSec).ToUniversalTime(); } }
运行效果参考图

内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

