两个GMT日期之间的时差

时间:2016-01-25 14:37:03

标签: javascript date momentjs

我正试图通过时间来区分两个GMT日期之间的天数

但我找不到它。

我在IST(+05:30),我在db中有一些GMT日期(-05:00),

我尝试使用以下命令

temp2.diff(temp1, "days")

这是在控制台中尝试的所有命令的屏幕截图 enter image description here

我们可以清楚地看到日期不同,仍然显示差异为0

这是我如何初始化'America/New_York'

的时刻对象
var temp1 = moment.tz(new Date('Mon Jan 25 2016 22:00:00 GMT-0600'), 'America/New_York');
 var temp2 = moment.tz(new Date('Tue Jan 26 2016 00:00:00 GMT-0600'), 'America/New_York');

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:4)

那些日期之间的差异不到24小时,所以这是正确的。 documentation说:

  

默认情况下,moment#diff会返回向下舍入的数字。如果需要浮点数,请将true作为第三个参数传递。

> temp2.diff(temp1, "days", true)
0.08333333333333333

如果您根本不关心时间,请在进行比较之前将其设为0

> temp2.hours(0).diff(temp1.hours(0), "days")
1

答案 1 :(得分:1)

一些事情:

  1. 您说您正在从数据库中检索这些值,但是您会告诉我们通过Date构造函数从字符串值加载它们。如果你真的在数据库中存储一个字符串,特别是那种特定的格式,那么你遇到的问题要比你提出的问题大得多!请向我们展示正好如何从数据库加载值。

  2. 您不应该依赖Date对象进行解析,尤其是当您已经使用了时刻时,它有更好的解析例程。

  3. 您在America/New_York中说了这些值,但是您显示的偏移量为-0600。那从未在那个时区使用过。您显示的值的偏移量为-0500

  4. 您还说“我有一些GMT日期(-05:00)” - 这没有任何意义。 GMT是+00:00。 GMT-0500意味着“格林威治标准时间<5小时”。因此,您不再拥有“GMT日期”。

  5. 请注意,JavaScript Date对象只能 使用代码运行位置的时区。您无法在任何其他时区运行它。

  6. 虽然Felix在使用diff函数显示小数的方式上是正确的,但您应该意识到diff正在给出您询问的两个时刻之间的实际经过时间。但是,您似乎想知道将时刻分配到指定时区内的两天的总日历天数。要做到这一点,你需要忽略时间部分。使用startOf('day')是一种简单的方法。考虑:

    var a = moment.parseZone("2016-01-25T23:00:00-05:00");
    var b = moment.parseZone("2016-01-26T01:00:00-05:00");
    
    b.diff(a, 'days', true) // 0.08333333333333333  (not what you want)
    
    b.startOf('day').diff(a.startOf('day'), 'days') // 1   (that's better!)
    
    moment(b).startOf('day').diff(moment(a).startOf('day'),'days')  // 1  (best approach)
    

    请注意以下代码:

    • 最后一行中的代码是最佳方法,因为它仅保留ab的原始值。否则,他们将被修改。 (时刻是可变的。)

    • 您似乎已经拥有正确的本地时间和偏移量,因此无需使用moment-timezone的tz函数。您可以使用parseZone。当然如果这只是你的例子的副作用,那么你仍然可以使用时刻 - 时区,但我强烈建议不要使用Date构造函数。