【问题标题】:Calculating if date picker + time picker are in the past of Eastern Standard Time zone计算日期选择器 + 时间选择器是否在东部标准时区的过去
【发布时间】:2016-07-16 12:13:27
【问题描述】:

我有一个标准输入 type=date 字段,它在发布时输出诸如“2016-03-28”之类的值,以及一个在发布时输出诸如“10:30pm”之类的值的时间选择器。我需要检查日期和时间的组合是否在过去相对于 EST(东部标准时区)。最好的方法是什么?

【问题讨论】:

  • 计算东部标准时间(可能是美国时间)的日期和时间,看看它是在日期之前还是之后。你试过什么?获得特定偏移量的时间并不困难。
  • 是的,我想多了。我不知道偏移量是如何工作的。我在下面发布了我是如何做到的。

标签: javascript date


【解决方案1】:

我是这样做的:

        var entryDate = $("input[name='launchDate']").val();
        var entryTime = $("input[name='launchtime']").val();
        var morningEvening = entryTime.slice(-2);
        var fixedTime;
        if (morningEvening === "am") {
          fixedTime = entryTime.split('am').join(' AM');
        } else {
          fixedTime = entryTime.split('pm').join(' PM');
        }

        var newDate = new Date(entryDate + " " + fixedTime);
        var inputDate = newDate.toLocaleString();
        var offset = -5.0;

        var clientDate = new Date();
        var utc = clientDate.getTime() + (clientDate.getTimezoneOffset() * 60000);

        var newYork = new Date(utc + (3600000*offset));
        var newYorkDate = newYork.toLocaleString();

        if (inputDate < newYorkDate) {
          console.log("It's in the past");
        } else {
          console.log("It's in the future");
        }

【讨论】:

  • 强烈建议使用 Date 构造函数解析字符串并比较由 toLocaleString 生成的字符串(这完全取决于实现,并在不同的环境中产生不同的结果)浏览器)似乎不是一个好主意。
【解决方案2】:

给定日期(例如 2016-03-28)和时间(例如晚上 10:30)的单独输入,您应该解析两者以生成日期。要将日期视为 EST(可能是美国 -05:00),请使用 UTC 方法创建日期并添加 5 小时。

“现在”的日期将具有 UTC 时间值,因此您可以按原样使用它,然后直接比较日期对象:

/* @param {string} ds - date string in format yyyy-mm-dd
** @param {string} ts - time string in format hh:mmap
** @returns {Date} Date with time value for equivalent EST time
*/
function parseDateTimeAsEST(ds, ts) {
  var b = ds.split(/\D/);
  var c = ts.split(/\D/);
  c[0] = +c[0] + (/pm$/i.test(ts)? 12 : 0);
  return new Date(Date.UTC(b[0], b[1]-1, b[2], c[0]+5, c[1]));
}

// Is now before or after 2016-03-28T22:30:00-05:00?
document.write(new Date() < parseDateTimeAsEST('2016-03-28','10:30pm')? 'before' : 'after');

document.write('<br>');

// Is now before or after 2016-04-01T01:30:00-05:00?
document.write(new Date() < parseDateTimeAsEST('2016-04-01','01:30am')? 'before' : 'after');

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 2016-12-30
    • 2015-04-30
    • 1970-01-01
    • 2012-09-11
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多