我正试图通过时间来区分两个GMT日期之间的天数
但我找不到它。
我在IST(+05:30),我在db中有一些GMT日期(-05:00),
我尝试使用以下命令
temp2.diff(temp1, "days")
我们可以清楚地看到日期不同,仍然显示差异为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');
感谢任何帮助,谢谢。
答案 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)
一些事情:
您说您正在从数据库中检索这些值,但是您会告诉我们通过Date
构造函数从字符串值加载它们。如果你真的在数据库中存储一个字符串,特别是那种特定的格式,那么你遇到的问题要比你提出的问题大得多!请向我们展示正好如何从数据库加载值。
您不应该依赖Date
对象进行解析,尤其是当您已经使用了时刻时,它有更好的解析例程。
您在America/New_York
中说了这些值,但是您显示的偏移量为-0600
。那从未在那个时区使用过。您显示的值的偏移量为-0500
。
您还说“我有一些GMT日期(-05:00)” - 这没有任何意义。 GMT是+00:00。 GMT-0500意味着“格林威治标准时间<5小时”。因此,您不再拥有“GMT日期”。
请注意,JavaScript Date
对象只能 使用代码运行位置的时区。您无法在任何其他时区运行它。
虽然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)
请注意以下代码:
最后一行中的代码是最佳方法,因为它仅保留a
和b
的原始值。否则,他们将被修改。 (时刻是可变的。)
您似乎已经拥有正确的本地时间和偏移量,因此无需使用moment-timezone的tz
函数。您可以使用parseZone
。当然如果这只是你的例子的副作用,那么你仍然可以使用时刻 - 时区,但我强烈建议不要使用Date
构造函数。