在javascript中转换为gmt日期的函数

时间:2012-04-16 08:58:39

标签: javascript date date-conversion

我有一个departureDate =日期字符串(2012年4月16日),时间字符串(05:00)和 TimeZone(亚洲/迪拜) 和arraivalDate =日期字符串(2012年4月16日),时间字符串(02:00)和 TimeZone(America / New_York)

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

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

此比较的目的是检查出发时间是否在出发时间之前。 在javascript中有任何功能吗? 请提供整个功能..

2 个答案:

答案 0 :(得分:2)

查看Date object文档。

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
}

答案 1 :(得分: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解析为这样的哈希并实现每个可能日期的正确日光调整的手动处理,每年变得越来越难,因为随着法律的变化,您将拥有支持旧日期的旧转换和新日期的新转换。如果您详细了解自己的需求,我可以添加更多细节。