【问题标题】:local machine vs travis.ci returning different results for `Date.toISOString()`本地机器与 travis.ci 为 `Date.toISOString()` 返回不同的结果
【发布时间】:2019-04-28 17:57:16
【问题描述】:

我刚刚遇到了这样一种情况:new Date(1999, 0, 1, 1, 1, 1).toISOString() 上的断言在我的 ci 进程 (travis) 中运行时导致测试失败,但在我的本地计算机上传递。

let dString = new Date(1999, 0, 1, 1, 1, 1).toISOString();
expect(dString).to.be('1999-01-01T08:01:01.000Z');

在 travis.ci 上运行时,出现断言错误:

预计“1999-01-01T01:01:01.000Z”等于“1999-01-01T08:01:01.000Z”

这似乎是一个时区问题,但我不确定我明白为什么?在我的本地机器上创建新日期似乎使用 UTC+8 偏移量。

但是,当在 travis 上运行时,它似乎使用UTC+0

日期时间和时区总是让我感到困惑。

我应该如何编写此测试以使其在任何环境中都能通过

【问题讨论】:

  • 您可以使用ntpjs.org,这将根据您的网络时间向您发送时间戳:
  • 这个测试的目的是什么?
  • @customcommander 显然这不是我正在运行的实际测试。我已经按照 SO 指南 stackoverflow.com/help/mcve 进行了简化。如果您只是好奇,它是平台 API 客户端的查询构建器库的一部分。
  • @DupinderSingh - 再一次,当前系统时间与这个问题没有任何关系,因此推荐 ntpjs 是题外话。对于与将当前时间与服务器时间对齐相关的问题,请保留此类建议。谢谢。

标签: javascript date datetime timezone travis-ci


【解决方案1】:

我使用以下行以 UTC 创建日期,现在它在两个平台上都传递:

new Date(Date.UTC(1999,0,1,1,1,1)).toISOString();

【讨论】:

  • 确实如此。您已经发现 toISOString 会发出一个 UTC 字符串,因此如果您在 Date.UTC 函数中传递输入参数,输出将符合您的预期。
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2021-12-28
  • 2018-01-31
  • 2016-07-10
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多