1

我有一个出发日期 = 日期字符串(2012 年 4 月 16 日)、时间字符串(05:00)和时区(亚洲/迪拜) 和 arraivalDate = 日期字符串(2012 年 4 月 16 日)、时间字符串(02:00) ,和时区(美国/纽约)

现在我需要比较上述日期,即

if (departureDate > arraivalDate) {
    // do something
}

这种比较的目的是检查到达时间是否在出发时间之前。javascript中有什么功能可以做到这一点吗?请提供整个功能..

4

2 回答 2

2

查看Date 对象文档。

有一种getTime方法可以让您根据通用时间获取与指定日期的时间相对应的数值。这意味着该getTime方法返回的值是自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。

这意味着您可以执行以下操作:

if (departureDate.getTime() > arrivalDate.getTime()) {
    // Do something
}

前提是您通过以下方式声明日期:

var departureDate = new Date(Date.UTC(year, month, day, hour, minute, second))
    arrivalDate = new Date(Date.UTC(year, month, day, hour, minute, second))

这样它就尊重时区。不过,您需要指定 UTC 日期。Javascript 没有比这更好的处理时区的内置方法。正如我的第一句话所述,请查看有关 Date 对象的文档。

编辑:在聊天中与您交谈后,这是我认为您想要的:

根据你有以下几点:

var orgti = document.getElementById('orginTimeZone').value; 
var desct = document.getElementById('descTimeZone').value;
var selfwDepDate = document.forms[0].fwDepartureDate.value; 
var selfwDepTime = document.forms[0].fwDepartureTime.value; 
var selfwArrDate = document.forms[0].fwArrivalDate.value; 
var selfwArrTime = document.forms[0].fwArrivalTime.value;

您可以这样做来比较两个日期:

var departureDate = new Date( Date.UTC( selfwDepDate + selfwDepTime ) ) // This creates a date with what you got
var arrivalDate = new Date( Date.UTC( selfwArrDate + selfwArrTime ) ) // This too

// Now the tricky part: you substract the timezone, so that you get the same referential for both dates
departureDate = departureDate.getTime() - ( orgit * 3600000 ) // Multiplying by 3600000 to transform hours into milliseconds since "getTime" returns milliseconds
arrivalDate = arrivalDate.getTime() - ( desct * 3600000 ) // Same

// Now, you've got two timestamps based on dates with the same referential. You can use:
if ( departureDate > arrivalDate ) {
    // Do something
}
于 2012-04-16T09:02:17.787 回答
1

如前所述,您仍然需要使用 getTime 来提取实际秒数进行比较。如果您有数字偏移量,您可以在比较之前将它们简单地添加到您的日期中。

// Assuming departure is in +4 TZ (Asia/Duabai) and arrival is in -4 TZ (America/New_York)
var departureMsec = departureDate.getTime() + (+4 * 3600 * 1000)
var arrivalMsec = arrivalDate.getTime() + (-4 * 3600 * 1000)
if (departureMsec > arrivalMsec) {
    // Do something
}

如果您没有偏移量,事情会变得更加复杂,因为输入中的数字或时区不限于某些常见的子集。我不知道是否有带有处理 JavaScript 代码的 tzdata 版本,所以我会为您提供如何手动操作的指示。如果您使用有限数量的区域并且它们都没有夏令时,那么您可以简单地将偏移量放入哈希中:

var offsets={
    "Asia/Dubai": +4,
    "America/New_York": -4,
}

并使用那里的数据。如果您需要任意数量的区域,最好的办法是将 tzdata 解析为这样的哈希,并为每个可能的日期手动处理正确的日光调整,这会变得越来越难,因为随着法律的改变,您将拥有支持旧日期的旧转换和新日期的新转换。如果您详细说明您的需求,我可以添加更多详细信息。

于 2012-04-16T09:39:45.237 回答