【问题标题】:Date now greater than date value given现在的日期大于给定的日期值
【发布时间】:2011-09-13 03:38:00
【问题描述】:

我必须尝试确定隐藏字段中的日期(格式为 mm/dd/yyyy)是否小于今天。如果是,我想让此人知道订阅已过期。我曾在某些情况下工作过,但它并不可靠??

//this is the expiration date that is in a hidden field
var expireDate = $("#expire").val();

//here I am trying to setup a new date for today and change the output to match the date
//format for the hidden field, i.e. mm/dd/yyyy
var a = new Date();
var b = a.toISOString().split("T")[0].split("-");
var ca = b[1] + "/" + b[2] + "/" + b[0];


//now I want to compare the 2 and if the expiration date is less than today, display a warning message                      
if (expireDate < ca) {
   $("<div class=\"message-warning\">This subscription is expired</div>")
    .insertAfter("#enddate");
};

【问题讨论】:

  • 您似乎试图对两个字符串执行大于比较?难怪它不能可靠地工作。
  • @Alastair - 他们为什么要在这种情况下考虑类型???
  • 感谢您指出这一点。为此,您介意就我做错的事情提供帮助吗?
  • @pertrai1 - #expire 中的值是什么样的?是日期的字符串表示形式,例如。 13/09/2011?
  • 请注意,当使用 Javascript(运行客户端)时,有人可以更改他们的系统时钟,这样他们的订阅就永远不会过期。

标签: jquery


【解决方案1】:

您正在比较字符串的数值,这恰好是 mm/dd/yyyy 格式的日期字符串表示形式。我猜你的“不一致”结果是,如果旧日期比今天早一个月,它就可以工作。

不是将 a 转换为字符串,而是将 expireDate 转换为 Date 对象。然后比较。

var expireDateStr = $("#expire").val();
var expireDateArr = expireDateStr.split("/");
var expireDate = new Date(expireDateArr[2], expireDateArr[0], expireDateArr[1]);
var todayDate = new Date();

if (todayDate > expireDate) {
   $("<div class=\"message-warning\">This subscription is expired</div>")
    .insertAfter("#enddate");
};

【讨论】:

  • 我认为您需要删除当前日期的时间部分才能使其正常工作。
  • 这将取决于他们订阅系统的语义。如果订阅在到期日的 00:00:01 到期,则代码按原样工作。如果它在到期日的 23:59:59 到期,那么您只需更改一行: var expireDate = new Date(expireDateArr[2], expireDateArr[0], expireDateArr[1], 23, 59, 59);
  • 这很好用,但我在 Firebug 中检查控制台日志时遇到的一个问题是该月提前 1 个月。因此,如果到期时间是 2011 年 5 月 8 日,则表示是 2011 年 6 月 8 日。如何调整以显示正确的月份?谢谢
  • 我忘记了 JavaScript 从 0 开始索引月份。只需在创建日期对象时从月份中减去 1.... var expireDate = new Date(expireDateArr[2], (expireDateArr[0] - 1), expireDateArr[1]);不过,您可能必须使用 parseInt。
  • 应该这么复杂吗?
【解决方案2】:
var expireDate = $("#expire").val().split('/'),
    expireYear = parseInt(expireDate[2], 10), // cast Strings as Numbers
    expireMo = parseInt(expireDate[0], 10),
    expireDay = parseInt(expireDate[1], 10);

var now = new Date(),
    nowYear = now.getFullYear(),
    nowMo = now.getMonth() + 1, // for getMonth(), January is 0
    nowDay = now.getDate();

// don't expire until day after expiry date
if (nowYear > expireYear ||
    nowYear == expireYear && nowMo > expireMo ||
    nowYear == expireYear && nowMo == expireMo && nowDay > expireDay) {

   $("<div class=\"message-warning\">This subscription is expired</div>")
    .insertAfter("#enddate");

};

【讨论】:

    【解决方案3】:

    other thread

    更简单的 IMO:

    var startDt=document.getElementById("startDateId").value;
    var endDt=document.getElementById("endDateId").value;
    
    if( (new Date(startDt).getTime() > new Date(endDt).getTime()))
    {
       ----------------------------------
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多