JavaScript Date.parse 不接受阿拉斯加时区?

标签 javascript timezone

JavaScript 的 Date.parse 与太平洋时间配合良好:

Date.parse('June 20 2015 10:22 PDT')

但是阿拉斯加时间失败了

Date.parse('June 20 2015 10:22 AKDT')

有人知道让阿拉斯加有时间的好解决方案吗?

最佳答案

JavaScript 的 Date.parse()方法接受根据 RFC 2822 格式化的日期字符串或ISO 8601 .

RFC 2822,section 3.3 ,列出有效日期/时间字符串的各个部分。 zone 规则规定时区指示符应该是 UTC 样式的偏移量(例如 -0800),或者是 obs-zone (过时的)时区指示符。 Section 4.3列出了 obs-zone 指示符,其中包括熟悉的 PDT、CST 等,但不包括 AKDT。

ISO 8601 time zone designators仅限于 UTC。

简而言之,您应该使用 UTC 偏移量来代替 AKDT 等指示符,或者编写一个映射函数来转换这些 obsolete designators在将日期时间字符串传递给 Date.parse() 之前先转换为 UTC。

编辑:

这段代码的算法本质上是有缺陷的。正如 @MattJohnson 在对原始帖子的评论中指出的那样,过时的时区指示符有几个含糊之处 - 例如CST 可以映射到 5 个不同的 UTC 偏移量。因此,没有通用的解决方案可以用 UTC 偏移量替换时区指示符,并确保替换正确。

var timeZoneDesignatorMap = {
  akdt : '-0800',
  akst : '-0900',
  art : '-0300'
  
  // Add other designators here.
};

function mappedDateParse(dateString) {
  var name, newDateString, regex;
  
  for (name in timeZoneDesignatorMap) {
    regex = new RegExp(name, 'i');
    if (dateString.search(regex) !== -1) {
      newDateString = dateString.replace(regex, timeZoneDesignatorMap[name]);
      return Date.parse(newDateString);
    }
  }
  
  return Date.parse(dateString);
}

console.log(mappedDateParse('June 20 2015 10:22 AKDT'));
console.log(mappedDateParse('June 20 2015 10:22 -0800'));
console.log(mappedDateParse('June 20 2015 10:22 pDT'));

关于JavaScript Date.parse 不接受阿拉斯加时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056823/

相关文章:

javascript - 使用 Sharp 进行不透明度设置的叠加

javascript - Gatsby 构建后 ScrollMagic 失去功能

javascript - 在 javascript 控制台日志中隐藏/加密敏感 POST json 的最佳方法

android - JodaTime 无法识别某些 Android 时区

python - django datetimefield 时区

javascript - 打开 Bootstrap 模式时如何清除以前的数据?

php - 在同一页面中显示目标 url 的 javascript 或 jquery 弹出窗口

java - Timestamp.getTime() 将时间戳值视为系统时区中的时间

java - Java的BST ZoneId代表什么?

ruby - 更改纯 ruby (不是铁轨)的时区