【问题标题】:Check weather the entered datetime is more than 72 hours from now?检查输入的日期时间是否超过 72 小时?
【发布时间】:2017-04-20 08:15:35
【问题描述】:

我有一个 DateTime 选择器,它以下列格式为 textbox 生成日期和时间,

01 May, 2017 - 03:45 pm

现在我需要检查这个 DateTime 是否超过 72 小时。为此,我在 Javascript 中使用了以下算法。

function chk() {
  try {
    debugger;
    var a = document.getElementById("txtdate").value;

    var adatepart = a.substring(0, 12).replace(",", "");

    //convert date part of txtbox
    var b = parseDate(adatepart);

    //getting number of hours of textbox from 1 jan 1970 midnight
    var seconds = new Date().getTime() / (3600 * 1000);

    //getting number of hours from 1 jan 1970
    var seconds1 = b.getTime() / (3600 * 1000);

    //adding additional hours and 12 hours if it's past noon
    seconds1 += parseInt(a.substring(15, 17)) + (a.substring(21, 23) == "pm" ? 12 : 0);
    var diff = seconds1 - seconds;
    if (diff > 72 || diff < 0) {
      alert("The selected date and time cannot be more than 72 hours from now");
    }
  } catch (err) {
    alert(err.message);
  }
}

function parseDate(input) {
  var map = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };
  input = input.split(" ");
  return new Date(input[2], input[1] in map ? map[input[1]] : input[1] - 1, input[0]);
}

这个算法运行良好。但我相信有一种更短的方法可以直接比较textbox 中的date.nowdatetime。也许通过 jQuery。有没有更短的方法?

【问题讨论】:

  • 如果您以可以由 Date 对象构造函数解析的格式存储另一个变量,您可以轻松比较两个日期对象并检查它们之间的天数是否超过 3,使其成为一个-班轮:(date2 - date1) / 1440000
  • 解析是否还会考虑日期的下午 03:45 部分,因为这是必要条件。
  • 试试momentjs 这对这类事情非常有用。

标签: javascript jquery date datetime


【解决方案1】:

这可能会有所帮助

diff = (parseDate(e.substring(0, 12).replace(",", "")).getTime() / (3600 * 1000) + parseInt(e.substring(15, 17)) + (e.substring(21, 23) == "pm" ? 12 : 0)) - new Date().getTime() / (3600 * 1000);

if (diff < -72) {
//Your code 
}

【讨论】:

    【解决方案2】:

    使用moment.js

    这里是你如何在你的代码中实现它,

    function chk() {
      var txtDate = moment(document.getElementById("txtdate").value, "DD MMM, YYYY - hh:mm a");
      var diffInHours = txtDate.diff(moment(), 'hours');
    
      if (diff > 72 || diff < 0) {
        alert("The selected date and time cannot be more than 72 hours from now");
      }
    };
    

    现在diffInHours 将在现在和选定的日期时间之间有时间差。

    你也不需要解析它。

    【讨论】:

      【解决方案3】:

      从字符串“01 May, 2017 - 03:45 pm”开始,您可以生成一个日期,减去 72 小时,然后查看它是否大于现在。

      有几个很好的库用于解析和格式化日期(例如 moment.jsfecha.js 很好),或者您可以使用自定义函数。

      // Parse date in format 01 May, 2017 - 03:45 pm
      function parseDate(s) {
        var months = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'];
        var b = s.match(/\w+/g);
        var invalidDate = new Date(NaN);
        if (!b || b.length != 6) return invalidDate;
      
        var d = new Date(b[2],
                         months.indexOf(b[1].toLowerCase()),
                         b[0],
                         b[3]%12 + (/pm/.test(b[5])? 12 : 0),
                         b[4],);
         return isNaN(d)? invalidDate : d;  
      }
      
      // Examples
      var s = '01 May, 2017 - 03:45 pm';
      var d = parseDate(s);
      d.setUTCHours(d.getUTCHours() - 72);
      
      console.log('Is ' + s + ' less than 72 hours from now? ' + (d < Date.now));
      
      var s = '22 Apr, 2017 - 03:45 pm';
      var d = parseDate(s);
      d.setUTCHours(d.getUTCHours() - 72);
      
      console.log('Is ' + s + ' less than 72 hours from now? ' + (d < Date.now()));

      请注意,使用 UTC 方法添加 72 小时意味着经过 72 小时,即使超出夏令时边界。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 2011-02-19
        • 2011-01-24
        • 2021-07-03
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        相关资源
        最近更新 更多