【问题标题】:Moment Timezone returns correct timezone but with wrong spellingMoment Timezone 返回正确的时区但拼写错误
【发布时间】:2018-12-16 08:32:03
【问题描述】:

我正在使用 MomentJS 时区。但是,当我执行 moment.tz.guess() 时,它会返回我的时区拼写错误。

const timezone = moment.tz.guess();
console.log(timezone); //returns Asia/Katmandu instead of Asia/Kathmandu

是的,我本来可以编辑 js 文件并更正拼写,但恐怕其他国家也一样。由于我不会意识到这一点,这可能会降低用户体验!

这种行为是预期的还是有什么方法可以解决?

看这个: Correct Timezone List [Moment] [Javascript] [PHP] [Internationalization API]

【问题讨论】:

  • 尝试使用自定义语言环境
  • 尝试在 moment.js github 上报告问题。我不知道我们这里的任何人对此能做些什么。
  • 您使用的是哪个版本的 moment-timezone?
  • @VincenzoC 我正在使用"moment": "^2.22.2","moment-timezone": "^0.5.21"!附:我还是想不出解决办法。

标签: javascript momentjs


【解决方案1】:

我正在使用 moment 2.2.22 和 0.5.17 数据,这是我找到的结果。

var timezones = moment.tz.names();
console.log(moment.tz.guess());
for (var i = 0; i < timezones.length; i++) {
  var node = document.createElement("LI");
  var textnode = document.createTextNode(timezones[i]);
  node.appendChild(textnode);
  document.getElementById("mm").appendChild(node);

}
#mm span {
  width: 100%;
}
<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="http://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>
<ul id='mm'></ul>

我的结果显示有两个名称来自同一时区(加德满都和加德满都),其写法类似于Asia/Kathmandu|Asia/Katmandu(一个更新的第二个已过时)。经过稍微研究后,我发现这是因为过时的时区和 chrome 行为,这个问题不会在 Firefox 或任何其他浏览器上发生。

此问题也不会由开发人员解决,因为这不会造成任何问题。这是一种已知的 Chrome 行为,会导致 Moment 做出错误的猜测。 Moment 开发团队对开发解决方法不感兴趣。更多信息可以在here找到。

所以我建议您使用字符串并根据您的需要格式化它并在上一个答案中提出建议。

注意

请在其他浏览器中测试该示例。

【讨论】:

  • 感谢您的解释。我所做的是列出了正确的时区:stackoverflow.com/questions/51435459/…
  • 你不能启动一个 git 项目而不是堆栈,我一定会为此做出贡献。这是否意味着赏金不会被授予。
  • 当然!我将启动一个 git 项目。完成后会和你谈谈!
【解决方案2】:

查看post 为什么结果不同。 如果您得到结果Asia/Katmandu,则返回值为Asia/Kathmandu

//for kathmandu, it returns Asia/Katmandu(chrome)
//returns Asia/Kathmandu (firfox);
var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
if(timeZone === 'Asia/Katmandu'){
  timeZone = 'Asia/Kathmandu';
}
console.log(timeZone);

MomentJs 演示

var timeZone = moment.tz.guess();
if(timeZone === 'Asia/Katmandu'){
  timeZone = 'Asia/Kathmandu';
}
console.log(timeZone);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.js" charset="utf-8"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.21/moment-timezone-with-data.js"></script>

【讨论】:

  • 那我应该怎么做才能解决这个问题呢?我浏览了你建议的帖子。我明白发生了什么,但仍然不知道如何解决这个问题。
  • @Sanjay,我得到的唯一选择是,检查字符串并替换。
  • 感谢您的回复,但如果其他大陆也一样呢?我很担心,因为我将这个时区存储在 MySQL 数据库中,并使用这些数据在 PHP 中执行date_default_timezone_set()
  • @Sanjay 然后它将推迟Asia/Calcutta 的结果,其有效值为Asia/Kolkata。这里支持time zone list。您需要相应地存储时区。
猜你喜欢
  • 2019-10-24
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
相关资源
最近更新 更多