Edg*_*ber 5 javascript timezone timezone-offset
当我转到浏览器开发工具并在控制台中编写 new Date() 时,它会给出以下内容
Mon Dec 18 2017 17:11:29 GMT+0200
Run Code Online (Sandbox Code Playgroud)
我认为它应该返回 UTC 时间。
问题是我在 AWS 上有一台服务器,它将 UTC 时间写入数据库。它将它写为字符串,在客户端我执行以下操作
const updatedMilliAgo = new Date() - new Date(timeStrFromDb);
Run Code Online (Sandbox Code Playgroud)
由于某种原因,差异甚至是两个小时,因为我在写入服务器后立即检查它。
我在这里做错了什么?
当您使用 时,您正在使用正在执行代码的系统时钟的当前值new Date()构造一个对象。Date该对象内部仅Date存储自 1970-01-01T00:00:00Z 以来的毫秒数(不考虑闰秒)。换句话说,对象始终代表 UTC 时间。Date
然而,对象上有许多在本地时间Date工作的函数和参数。例如,当您调用对象时,计算机的本地时区将应用于基于 UTC 的内部值,以生成反映本地时间的字符串。.toString()Date
在这种情况下-无法直接记录console.log标准对象。Date相反,大多数实现将记录一个字符串值。该值的创建方式完全是特定于实现的,而不是由 ECMAScript 规范定义的。许多实现将返回相同的基于本地时间的值.toString()。有些(例如 FireFox)将返回与.toISOString()返回的相同的基于 UTC 的值。实现返回实际存储的毫秒数 ( .valueOf()) 或某种其他表示形式是合理的。如果您需要一致性,不要只记录Date对象。相反,记录其返回字符串或数字的函数之一的输出。
您还询问了如何减去两个日期对象。这将隐式调用.valueOf()每个对象,减去它们基于 UTC 的内部值并给出它们之间的毫秒数。您最可能遇到的问题是如何构造第二个Date对象。您没有给出由什么timeStrFromDb组成的示例,但要了解该字符串的格式如何与Date对象的构造方式直接相关。如果您没有使用标准化格式,或者您不清楚该值是基于 UTC 还是基于 UTC 的特定偏移量,则您的字符串的解析方式可能与您预期的不同。
尝试使用
var d = new Date();
var n = d.toUTCString();
console.log(n)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12209 次 |
| 最近记录: |