Heroku 时区问题与 Moment.js

4
在我的生产/Heroku应用中,下面的代码返回的小时数比在我开发/本地应用程序中运行时下面的代码返回的小时数多7个小时。这是为什么?
var startDate = moment.tz("2000-01-01", "America/Edmonton").startOf('day');
var endDate   = moment.tz("America/Edmonton");

hourly_count = parseInt(endDate.diff( startDate, 'hours' ) + 1 );

我也遇到了类似的奇怪情况。在我的开发机上,moment("APR 27, 2014 12:00PM", ['MMM DD, YYYY hh:mmA']).valueOf() 的结果是 1398621600000,但在Heroku上却是相同值的 1398600000000 - marknadal
@marknadal - 这是一个不同的问题。您提供的输入是以本地时间为基础的。valueOf始终会给出反映自Unix纪元以来的毫秒数的时间戳,这是以UTC为基础的。 - Matt Johnson-Pint
3个回答

0

因为您正在使用moment-timezone指定了具名时区,所以本地计算机和服务器之间存在不同结果的可能原因仅有两种:

  • 设备中的一个或两个上的时钟未正确设置。 可能Heroku的时钟无问题,所以请检查您的时钟。

  • 您没有加载任何moment-timezone的时区数据。 在这种情况下,旧版本的moment-timezone会悄悄地回退到本地时间。 新版本将会报错。

    您应该使用“with-data”发行版中的一个,或通过moment.tz.add函数加载您感兴趣的时区数据。

既然本问题是在2014年编写的,请注意第二个问题。


0

Heroku 出现了一些问题。它会自动将时间计算为 UTC。

代码

var tms = 1492554237000

console.log(moment(tms).format("YYYY-MM-DD HH:mm:ss"))
console.log(moment.utc(tms).format("YYYY-MM-DD HH:mm:ss"))

本地输出

2017-04-19 06:23:57
2017-04-18 22:23:57

Heroku服务器输出

2017-04-18 22:23:57
2017-04-18 22:23:57

我通过调整时间戳来解决了这个问题。

if (moment().utcOffset() == -0){
    // for server
    tms += 28800000
}

Heroku 服务器输出新内容

2017-04-19 06:23:57
2017-04-19 06:23:57

这不是对所提出问题的答案。你只是观察到Heroku的本地时区恰好是UTC。所提出的问题是使用moment-timezone中特定的命名时区。 - Matt Johnson-Pint
1
另外,你调整的方式是不正确的。那将选择完全不同的时间点。你在本地输出中显示的确实是我期望从任何处于UTC+8本地时区的计算机上看到的内容。 - Matt Johnson-Pint

-1

问题已经展示了如何使用moment-timezone,通过使用tz函数。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接