不同计算机上的纪元日期转换结果不同

Posted

技术标签:

【中文标题】不同计算机上的纪元日期转换结果不同【英文标题】:Epoch Date conversion different result on different computer 【发布时间】:2021-02-12 02:59:25 【问题描述】:

我遇到了 Epoch Date 转换问题。为此,我正在使用 moment.js javascript 库。我有一个 Epoch 格式的 UTC DateTime 值。当我在两台不同的计算机(使用不同的时区)上运行相同的纪元转换代码时,我会得到不同的日期转换结果。

我正在使用以下 JavaScript 代码:

 var epochTime = 1603825239000;

 var result = moment(epochTime).format('lll'); 

 document.write(result); // the result I get is: Oct 28, 2020 6:00 AM

现在,当在另一台具有太平洋时区的计算机上运行完全相同的代码时,它会返回结果为:

  var epochTime = 1603825239000;

  var result = moment(epochTime).format('lll'); 
 
  document.write(result); // now the result is different: Oct 27, 2020 12:00 PM

我可以做些什么来确保无论计算机时区如何,纪元日期转换结果都不会改变?我总是得到第一个转化价值,即 2020 年 10 月 28 日上午 6:00

【问题讨论】:

1603825239000 == "2020-10-27T19:00:39.000Z"。其他任何事情都反映了到本地时间的转换 - 当然在不同的时区会有所不同。您尝试查看哪个时区?另请参阅codeofmatt.com/please-dont-call-it-epoch-time 嗨,马特,我正在尝试获取 UTC 时间,因为在 SQL Server 中,UTC 时间戳存储为“2020-10-28 06:00:39.997”。我有一个 WCF,它以 Epoch 格式返回时间,其值为“1603825239000” 如果数据库确实是 UTC 时间,并且确实是早上 6 点,那么您在 WCF 组件中错误地将其转换为 Unix 时间戳。您可能已经介绍了运行该代码的计算机的本地时区。您显示的时间戳不是世界标准时间早上 6 点,而是前一天世界标准时间晚上 7 点。我建议仔细检查您的 .NET 代码,并可能提出一个显示该代码的新问题。 问题不在于您的 JavaScript,而明显在于您的 C# 代码。在从数据库中填充它之后,序列化结果之前,您需要使用类似 yourDateTime = DateTime.SpecifiyKind(yourDateTime, DateTimeKind.Utc) 的东西。 如果 json 在时间戳 (Z = UTC) 的末尾有一个 Z 会更好。那么您就不需要指定种类 - Newtonsoft 会为您完成。但是,如果您确实指定了样例中显示的种类,那么您的 WCF 输出(您没有显示)将有+0000,而不是+1100。所以在某个地方你正在失去那种。一路调试并检查.Kind 属性。此外,我们离这个话题开始的地方还很远。您最好提出一个新问题,重点关注代码的 C# 部分(包括 WCF)。 【参考方案1】:

您可以使用moment timezone 指定您希望显示时间的时区。

或者,我们可以使用 moment.utc() 来创建一个设置为 UTC 时区的日期。

const epochTime = 1603825239000;
const timeZone = "America/Los_Angeles";

const date = moment.tz(epochTime, timeZone);
console.log("Time in timezone:",date.format('lll'))

// Or just write UTC time
console.log("UTC time:",moment.utc(epochTime).format('lll'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.25/moment-timezone-with-data-10-year-range.js"></script>

【讨论】:

感谢特里的回复。我现在可以看到在我的末端发生了什么。我的开发服务器实际上与生产服务器位于不同的时区。生产服务器将 JSON DateTime 返回为“/Date(1603864839000+0000)/”。然而,我的开发服务器(位于不同时区)返回与“/Date(1603825239000+1100)/”完全相同的时间,即在原始时间上增加 11 小时。有没有办法我可以考虑 +1100 或减去 11 小时并使用 moment.js 或 JavaScript 获得实际的原始日期? @theITvideos——见.NET date, Moment.js, UTC and Timezone shifting。不需要库。

以上是关于不同计算机上的纪元日期转换结果不同的主要内容,如果未能解决你的问题,请参考以下文章

在 Google 表格中将 Unix 纪元时间转换为日期

将日期、时间和 UTC 偏移值转换为自 unix 纪元以来的毫秒数?

从纪元到日期时间的转换不正确

如何将纪元转换为日期时间红移?

将 UNIX 纪元转换为日期对象

Javascript将日期时间字符串转换为纪元