【问题标题】:Compare dates with javascript [duplicate]用javascript比较日期[重复]
【发布时间】:2012-06-25 13:41:23
【问题描述】:

我在 javascript 中有两个日期:

var first = '2012-11-21';
var second = '2012-11-03';

我想做:

 if(first > second){
   //...
 }

如果没有外部库,最好的方法是什么?

【问题讨论】:

  • 不可能重复,完全重复 - 甚至标题都一样 :) (人们在提问之前是否曾 Google 搜索过?)
  • @DvirAzulay -它不是完全重复:这个显示了足够的代码来暗示将使用具有特定日期格式的字符串(正如我的回答中所解释的那样,需要没有转换才能进行比较),但另一个问题没有提供有关格式的信息。

标签: javascript date


【解决方案1】:
if( (new Date(first).getTime() > new Date(second).getTime()))
{
    ----------------------------------
}

【讨论】:

  • 工作量太大,新建2个Date对象,3次乘法,对比一下。
  • 它不适用于 dd/mm/yyyy 格式,因此需要转换为 mm/dd/yyyy 或 yyyy/mm/dd
  • 无需调用 getTime() 方法即可工作。
  • 这很棒,它允许我通过将 .getTime() 附加到我用 toUTCString() 转换为字符串的日期对象来比较日期,但无法比较转换为字符串的日期过去,所以这是一个不错的惊喜!
【解决方案2】:

如果您的日期是严格的yyyy-mm-dd 格式的字符串,如问题所示,那么您的代码将按原样工作,而无需转换为日期对象或数字:

if(first > second){

...将进行字典(即字母数字“字典顺序”)字符串比较 - 它将比较每个字符串的第一个字符,然后是每个字符串的第二个字符,等等。这将给出您想要的结果。 ..

【讨论】:

  • 这是我见过的最明智的答案,应该得到更多的支持
【解决方案3】:

你可以这样做,它会很好地工作:

var date1 = new Date('2013-07-30');
var date2 = new Date('2013-07-30');

if(date1 === date2){ console.log("both are equal");}  //it does not work 
==>undefined  //result
if(+date1 === +date2){ console.log("both are equal");} //do it this way! 
//(use + prefix for a variable that holds a date value)
==> both are equal //result

注意:- 不要忘记使用 + 前缀

【讨论】:

  • 在 IE 中工作。让它在 Chrome 中工作时遇到问题。 IE 日期来自文本框。 Chrome 来自日期选择器。
【解决方案4】:

最好的办法是,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}

【讨论】:

    【解决方案5】:

    由于您的日期格式,您可以使用以下代码:

    if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
       //...
    }
    

    它会检查20121121的数字是否大于20121103

    【讨论】:

    • 不,它不会工作。 replace 将仅替换第一次出现的破折号。
    • 当然,我对其进行了编辑和测试,它现在可以工作了:)
    • 如果可以依靠该日期格式(根据我的回答),您可以将它们作为字符串进行比较,无需转换...
    • 他可能有2012-11-3,想想吧:)
    • 这就是为什么我说“如果可以依靠这种日期格式”。如果不是,那么我们的答案都不适用于个位数的月份。如果数据是由用户输入的,那么(到目前为止)没有一个答案是可靠的......
    【解决方案6】:

    在javascript中使用此函数进行日期比较:

        function fn_DateCompare(DateA, DateB) {
          var a = new Date(DateA);
          var b = new Date(DateB);
    
          var msDateA = Date.UTC(a.getFullYear(), a.getMonth()+1, a.getDate());
          var msDateB = Date.UTC(b.getFullYear(), b.getMonth()+1, b.getDate());
    
          if (parseFloat(msDateA) < parseFloat(msDateB))
            return -1;  // less than
          else if (parseFloat(msDateA) == parseFloat(msDateB))
            return 0;  // equal
          else if (parseFloat(msDateA) > parseFloat(msDateB))
            return 1;  // greater than
          else
            return null;  // error
      }
    

    【讨论】:

      【解决方案7】:

      你也可以这样做。

      if (dateFormat(first, "yyyy-mm-dd") > dateFormat(second, "yyyy-mm-dd")) {
              console.log("done");
      }
      

      if (dateFormat(first, "mm-dd-yyyy") >  dateFormat(second, "mm-dd-yyyy")) {
              console.log("done");
      }
      

      我为 dateFormat() 使用以下插件

              var dateFormat = function () {
              var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
                  timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
                  timezoneClip = /[^-+\dA-Z]/g,
                  pad = function (val, len) {
                      val = String(val);
                      len = len || 2;
                      while (val.length < len) val = "0" + val;
                      return val;
                  };
      
              // Regexes and supporting functions are cached through closure
              return function (date, mask, utc) {
                  var dF = dateFormat;
      
                  // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
                  if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
                      mask = date;
                      date = undefined;
                  }
      
                  // Passing date through Date applies Date.parse, if necessary
                  date = date ? new Date(date) : new Date;
                  if (isNaN(date)) throw SyntaxError("invalid date");
      
                  mask = String(dF.masks[mask] || mask || dF.masks["default"]);
      
                  // Allow setting the utc argument via the mask
                  if (mask.slice(0, 4) == "UTC:") {
                      mask = mask.slice(4);
                      utc = true;
                  }
      
                  var _ = utc ? "getUTC" : "get",
                      d = date[_ + "Date"](),
                      D = date[_ + "Day"](),
                      m = date[_ + "Month"](),
                      y = date[_ + "FullYear"](),
                      H = date[_ + "Hours"](),
                      M = date[_ + "Minutes"](),
                      s = date[_ + "Seconds"](),
                      L = date[_ + "Milliseconds"](),
                      o = utc ? 0 : date.getTimezoneOffset(),
                      flags = {
                          d:    d,
                          dd:   pad(d),
                          ddd:  dF.i18n.dayNames[D],
                          dddd: dF.i18n.dayNames[D + 7],
                          m:    m + 1,
                          mm:   pad(m + 1),
                          mmm:  dF.i18n.monthNames[m],
                          mmmm: dF.i18n.monthNames[m + 12],
                          yy:   String(y).slice(2),
                          yyyy: y,
                          h:    H % 12 || 12,
                          hh:   pad(H % 12 || 12),
                          H:    H,
                          HH:   pad(H),
                          M:    M,
                          MM:   pad(M),
                          s:    s,
                          ss:   pad(s),
                          l:    pad(L, 3),
                          L:    pad(L > 99 ? Math.round(L / 10) : L),
                          t:    H < 12 ? "a"  : "p",
                          tt:   H < 12 ? "am" : "pm",
                          T:    H < 12 ? "A"  : "P",
                          TT:   H < 12 ? "AM" : "PM",
                          Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
                          o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
                          S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
                      };
      
                  return mask.replace(token, function ($0) {
                      return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
                  });
              };
          }();
      
          // Some common format strings
          dateFormat.masks = {
              "default":      "ddd mmm dd yyyy HH:MM:ss",
              shortDate:      "m/d/yy",
              mediumDate:     "mmm d, yyyy",
              longDate:       "mmmm d, yyyy",
              fullDate:       "dddd, mmmm d, yyyy",
              shortTime:      "h:MM TT",
              mediumTime:     "h:MM:ss TT",
              longTime:       "h:MM:ss TT Z",
              isoDate:        "yyyy-mm-dd",
              isoTime:        "HH:MM:ss",
              isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
              isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
          };
      
          // Internationalization strings
          dateFormat.i18n = {
              dayNames: [
                  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
                  "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
              ],
              monthNames: [
                  "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
                  "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
              ]
          };
      
          // For convenience...
          Date.prototype.format = function (mask, utc) {
              return dateFormat(this, mask, utc);
          };
      

      【讨论】:

      • dateFormat() 函数是什么?
      • @nnnnnn 我为 dateFormat() 添加了一个插件。
      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      相关资源
      最近更新 更多