【问题标题】:jQuery/JS - How to compare two date/time stamps?jQuery/JS - 如何比较两个日期/时间戳?
【发布时间】:2011-03-02 23:46:40
【问题描述】:

我有两个日期/时间戳:

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')}

但这似乎无法正常工作。有没有办法不仅可以比较日期,还可以比较时间。?谢谢

更新:

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

【问题讨论】:

  • 您是否有字符串形式的时间戳,或者您实际上是否有“日期”实例? (我问是因为这些赋值语句是目前的语法错误。)
  • 错误是正确答案。 “2011-03-02T15:30:18-08:00”不大于“2011-03-02T15:36:05-08:00”。
  • 此外,除了第一条控制台消息之外,d1 中的所有内容都有些奇怪。它们都以“36:515”开头

标签: javascript jquery


【解决方案1】:

您的时间戳应该是字符串。

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/

【讨论】:

  • @patrick 我不确定日期是否被正确解析。第一个我得到Thu Mar 03 2011 00:30:18 GMT+0100 (Central European Standard Time)
  • 它们是字符串,这只是写问题的一个错误。所以 Date 不仅会比较日期,还会比较时间/秒的详细程度。/
  • @Šime Vidas:它正在被解析为您当地的时区。
  • @Šime:也许你是对的。我没有仔细看结果。仍然相对于彼此,它们似乎是一致的。
  • 我刚刚更新了Q,你看看,总是返回false
【解决方案2】:

您可能在使用日期字符串格式时遇到问题。如果我这样做,我会得到无效的日期:

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')}

如果您在服务器端使用 ruby​​,您可以从 Time 对象转换为 UTC。就是这样,稍微按摩一下就可以转换成与 javascript 的 Date 对象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"

【讨论】:

  • 这似乎是问题所在,我在 Rails 中,是否需要进行日期戳转换?
  • 尝试转换为 UTC,格式如下:Thu, 03 Mar 2011 00:20:57 GMT
【解决方案3】:

对我来说似乎可以正常工作,尽管您必须正确格式化(即分号、引号):

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 秒。这是两者之间的正确区别。

【讨论】:

  • 谢谢,但请看上面,它总是返回 false。
  • 在问题中阅读我的 cmets。
  • 非常有趣,如果我执行 (new Date(d1) - new Date(d2)) 我会得到 NaN
  • 也许我可以使用 rails 来输出正确的时间戳?
【解决方案4】:

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

目前使用的很多浏览器都不能——您可能需要编写自己的转换。

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

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')

【讨论】:

    【解决方案5】:

    鉴于浏览器之间日期格式和功能的差异,我真的建议您使用专门用于处理 DateTime 的库。 JS 对它的支持是出了名的可怕。我是 date.js 的超级粉丝

    http://www.datejs.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      相关资源
      最近更新 更多