2011-03-02 81 views
3

我有两个日期/时间戳:jQuery/JS - 如何比较两个日期/时间戳?

d1 = 2011-03-02T15:30:18-08:00 
d2 = 2011-03-02T15:36:05-08:00 

我想上面比较两种:

if (new Date(d1) < new Date(d2)) {alert('newer')} 

但是,这似乎并没有正常工作。有没有办法比较日期和时间?感谢

UPDATE:

console.log(d1 + ' ' + d2); 
console.log(new Date(d1) > new Date(d2)) 


2011-03-02T15:30:18-08:00 2011-03-02T15:36:05-08:00 
false 
2011-03-02T15:30:18-08:00 2011-03-02T15:30:18-08:00 
false 
2011-03-02T15:30:18-08:00 2011-03-02T14:15:04-08:00 
false 
+1

你有一个字符串形式的时间戳,还是你确实有“日期”的实例? (我问,因为这些赋值语句是语法错误,因为他们目前的立场。) – Pointy 2011-03-02 23:51:14

+0

假是正确的答案。 “2011-03-02T15:30:18-08:00”不大于“2011-03-02T15:36:05-08:00”。 – 2011-03-03 00:04:01

+0

另外,除了第一个控制台消息外,d1中的所有内容都很奇怪。他们都以“36:515”开头 – 2011-03-03 00:04:54

回答

12

你的时间戳应弦。

var d1 = "2011-03-02T15:30:18-08:00"; 
var d2 = "2011-03-02T15:36:05-08:00"; 

if (new Date(d1) < new Date(d2)) {alert('newer')} 

例子:http://jsfiddle.net/hKPkF/

+0

@patrick我不确定日期是否正确解析。我得到'Thu Mar 03 2011 00:30:18 GMT + 0100(中欧标准时间)'为第一个。 – 2011-03-02 23:54:16

+0

他们是字符串,这只是写了问题的一个愚蠢。所以日期不仅会比较日期,还会与时间/秒的详细程度进行比较./ – AnApprentice 2011-03-02 23:54:45

+0

@ŠimeVidas:正在为您当地的时区进行分析。 – 2011-03-02 23:55:47

2

似乎为我工作得很好,但你必须正确格式化(即分号,引号):

var d1 = "2011-03-02T15:30:18-08:00"; 
var d2 = "2011-03-02T15:36:05-08:00"; 

if(new Date(d1) < new Date(d2)) {alert('newer')}; 

是的,它需要一定的时间到帐户。如果你这样做:

alert(new Date(d1) - new Date(d2)); 

你得到347000,其为347秒,即5分钟47秒。这是两者之间的正确区别。

+0

工作谢谢但请参阅上面,它总是返回false。 – AnApprentice 2011-03-03 00:01:33

+0

阅读我在问题中的评论。 – 2011-03-03 00:06:37

+0

非常有趣,如果我做(新日期(d1) - 新日期(d2))我得到NaN – AnApprentice 2011-03-03 00:10:45

4

您可能会遇到日期字符串格式的问题。我越来越无效的日期,如果我做的:

new Date("2011-03-02T15:30:18-08:00"); 

下面是我有什么适用于Chrome:

var d1 = "Thu Mar 03 2011 00:53:54 GMT+0100 (CET)"; 
var d2 = "Thu Mar 03 2011 03:53:54 GMT+0100 (CET)"; 

if (new Date(d1) < new Date(d2)) {console.log('newer')} 

如果您在服务器端红宝石工作,你可以转换为UTC从Time目的。这里,它是一个小按摩转换为格式是相同的JavaScript的日期对象toUTCString方法:

tm = Time.new 
utc_tm = tm.getutc 
utc_tm.strftime("%a, %d %b %Y %H:%M:%S GMT") 

输出:"Thu, 03 Mar 2011 00:46:55 GMT"

+0

这似乎是问题,我在轨道上,是否有我需要做的datestamp对话? – AnApprentice 2011-03-03 00:11:20

+0

尝试转换为UTC,格式如下:'Thu,03 Mar 2011 00:20:57 GMT'。 – madsj 2011-03-03 00:42:14

1

变种D1 =“2011-03-02T15:30:18 -08:00',d2 ='2011-03-02T15:36:05-08:00'; 某些浏览器可以使用新的Date或Date.parse将ISO字符串转换为Date。

今天很多浏览器都无法使用 - 您可能需要编写自己的转换。

这一个似乎工作,但它需要改进。基于mozilla org的公共代码,我添加了一个没有array.map的浏览器。

Date.fromISO= function(s){ 
    var day, tz, 
    rx= /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/, 
    p= rx.exec(s) || []; 
    if(p[1]){ 
     day= p[1].split(/\D/).map(function(itm){ 
      return parseInt(itm, 10) || 0; 
     }); 
     day[1]-= 1; 
     day= new Date(Date.UTC.apply(Date, day)); 
     if(!day.getDate()) return NaN; 
     if(p[5]){ 
      tz= parseInt(p[5], 10)*60; 
      if(p[6]) tz += parseInt(p[6], 10); 
      if(p[4]== "+") tz*= -1; 
      if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz); 
     } 
     return day; 
    } 
    return NaN; 
} 
Array.prototype.map= Array.prototype.map || function(fun, scope){ 
    var L= this.length, A= [], i= 0; 
    if(typeof fun== 'function'){ 
     while(i< L){ 
      if(i in this) A[i]= fun.call(scope, this[i], i, this); 
      ++i; 
     } 
     return A; 
    } 
} 
var d1= '2011-03-02T15:30:18-08:00', d2= '2011-03-02T15:36:05-08:00'; 
alert(Date.fromISO(d1)-Date.fromISO(d2)+' milliseconds') 
1

鉴于浏览器之间日期格式和功能的差异,我真的推荐您使用专门用于DateTime处理的库。 JS对它的支持是非常可怕的。我是日期的巨大粉丝。JS

http://www.datejs.com/