【问题标题】:How can I check date and time on javascript?如何在 javascript 上查看日期和时间?
【发布时间】:2020-08-20 21:55:27
【问题描述】:

我的脚本是这样的:

function checkDatetime() {
    const e = new Date((new Date).toLocaleString("en-US", {
        timeZone: "Asia/Jakarta"
    }));
    return e.getDay() >= 1 && e.getDay() <= 5 && e.getHours() >= 8 && e.getHours() < 17
}

如果 checkDatetime 返回 true,则会显示消息“Available”

如果 checkDatetime 返回 false,则会显示消息“不可用”

我已经对其进行了测试,并且可以正常工作。我在雅加达(印度尼西亚)的职位

但有些人在 18:20 和 22:22 调用该函数并显示“可用”

是否应该显示“不可用”

这是时区问题吗?

更新

我的另一个解决方案:

function checkDatetime() {
  const offsetHours = new Date().getTimezoneOffset() / 60;
  const day = new Date();

  day.setHours(day.getHours() + offsetHours);

  return day.getDay() >= 1 && day.getDay() <= 5 && day.getHours() >= 1 && day.getHours() < 10;
}

【问题讨论】:

  • 更新(不可靠地)将时间移动了本地偏移量,因此实际上是 UTC。您也可以使用 getUTCDaygetUTCHours 来做同样的事情。提供给 setHours 的值应该是整数,小数值被截断为整数部分。由于许多地方的偏移量不是偶数小时(例如印度部分地区和澳大利亚中部),因此您的调整对它们来说不会是一致的(即使它有用)。
  • @RobG 所以我的第二个脚本不能有效解决这个问题?

标签: javascript jquery date datetime timezone


【解决方案1】:

您对 ECMAScript Date 对象有一个根本性的误解。它们只是 1970-01-01T00:00:00Z 的偏移量,没有其他关联数据,例如时区或偏移量。

表达式:

new Date((new Date).toLocaleString("en-US", {
    timeZone: "Asia/Jakarta"
}));

(new Date) 为当前时间创建一个日期,使用选项调用 toLocaleString 会为位置“亚洲/雅加达”的当前日期和时间生成一个时间戳。

然后通过对 Date 构造函数的封闭调用对其进行解析,以生成同一时刻的 Date。如果生成的字符串包含“Asia/Jakarta”的时区名称或偏移量(它可能会或可能不会取决于它的实现)它与以下内容相同:

 new Date();

所以 getDay 返回当地时区的日期,而不是“亚洲/雅加达”。另请注意,内置解析器可能无法正确解析 toLocaleString 返回的字符串,尤其是在使用了选项的情况下。

如果您想使用内置方法,请考虑Intl.DateTimeFormat constructorformatToParts method。这将返回特定代表性位置(如“亚洲/雅加达”)的日期和时间部分的字符串值。然后,您可以像使用 Date 方法一样使用这些部件。

请注意,某些日期部分与相关的日期方法具有不同的名称,并且返回的是日期名称而不是数字。

function checkDatetime(loc) {
  let f = new Intl.DateTimeFormat('en', {
    year    : 'numeric',
    month   : '2-digit',
    day     : '2-digit',
    weekday : 'short',
    hour    : '2-digit',
    hour12  :  false,
    minute  : '2-digit',
    second  : '2-digit',
    timeZone: loc
  });
  let temp = f.formatToParts(new Date());
  let parts = temp.reduce((acc, part) => {
    if (part.type != 'literal') {
      acc[part.type] = part.value;
    }
    return acc;
  }, Object.create(null));
  
  // Debug
  console.log(parts);
  
  return parts.weekday != 'Sat' && parts.weekday != 'Sun' &&
         parts.hour >= 8 && parts.hour < 17;
}

console.log(checkDatetime('Asia/Jakarta'));

【讨论】:

  • 好的,谢谢。我会试试你的代码。我有一个更简单的代码。看到我的问题。我用我的答案更新了答案。你有什么看法?
  • 我仍在尝试您的代码。如果可行,我会接受你的回答
  • 我已经在我的生产网站上实现了你的代码。但是有一些用户可以进入。您的代码是否可以在所有浏览器中运行?似乎在某些浏览器中它不起作用
  • @positivethinking——定义“不起作用”。我已经在 Safari、Opera、Firefox 和 Chrome 的最新版本中对其进行了测试。您的一些用户可能有不支持时区选项的旧浏览器,这就是为什么这种计算应该在您知道代码将正确运行的服务器上进行。
  • 我的意思是有些用户可以在 17.00 以上登录。例如在 19:30。所以您的代码在旧浏览器版本中不起作用?您的代码是否适用于所有区域?
【解决方案2】:

JavaScript 的 Date 对象在内部记录和跟踪 UTC 时间,但它接受输入并在其运行的本地时间产生输出。在其他时区处理时间的设施很少。

你可以使用库moment.js然后使用函数

var timeDifference = new Date().getTimezoneOffset();

计算客户端与UTC的时区差异。

或者,你可以使用

var timeZone = moment.tz.guess();

它将返回 IANA 时区标识符,例如美国太平洋时区的 America/Los_Angeles。

这是来自 moment.js 网站的图片之一,您可以在其中看到处理它的方法。

【讨论】:

    【解决方案3】:

    我测试了您的函数,它按应有的方式工作,即,如果它是 M-F,则返回 true,在 JKT 中返回 8-5,如果不是,则返回 false。

    我能想到两个可能的问题: 1.函数调用checkDateTime并返回“Available”或“Not Available”有问题 2. 您的服务器没有设置为当前日期和时间,因此即使您将日期时间转换为 JKT 时区,您的函数也不会返回预期的输出。

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 2021-10-24
      • 2014-08-02
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多