2014-04-19 62 views
4

在我的生产/ heroku应用程序中,下面的代码返回的小时数比下面的代码在我的开发/本地应用程序中运行时返回的小时数多7个小时。为什么是这样?Heroku Timezone Issue with Moment.js

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); 
+0

我也有类似的奇怪的事情发生。在我的开发机器的时刻(“APR 27,2014 12:00 PM”,['MMM DD,YYYY hh:mmA'])。valueOf()'给出了'1398621600000',但是在Heroku上它给出了'1398600000000'值。 – marknadal

+0

@marknadal - 这是一个不同的问题。您按照当地时间提供输入。 'valueOf'总是给出一个时间戳,它反映了Unix时代以来的毫秒数,这是以UTC为单位的。 –

回答

-1

您正在部署的目标机器可能是UTC,您将要设置它或使用Moment Timezone。 http://momentjs.com/timezone/

+0

这个问题已经通过使用'tz'函数显示了使用时间 - 时区。 –

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 
+0

这不是对问题的回答。你只是在观察Heroku的* local *时区碰巧是UTC。问的问题是使用特定的*时区和时区。 –

+0

另外,他们调整的方式不正确。这将完全选择不同的时间点。您在本地输出中显示的内容确实是我期望从任何位于UTC之前8小时的本地时区的计算机上看到的结果。 –

0

因为您指定了一个名为时区与矩时区,只有两个具有本地计算机和服务器之间不同的结果,可能的原因:

  • 在一台或两台设备上时钟设置不正确。可能Heroku的时钟很好,所以请检查你的。

  • 您不会将任何时区数据加载到瞬时时区。在这种情况下,较早版本的moment-timezone会默默地回落到当地时间。较新的版本会出错。

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

很可能是,因为这个问题是在2014年写的,这是第二个问题。