Moment: 工作日区域设置问题

创建于 2017-07-15  ·  7评论  ·  资料来源: moment/moment

问题描述和重现步骤:
正如官方文件中所说,
moment.locale('zh_CN');
moment.weekdays(true); // lists weekdays Monday-Sunday in Chinese
如果为 true,则工作日将按区域设置特定顺序返回。 但在这种情况下,区域设置在全局更改的那一刻。

因此,如果我只想在本地更改语言环境,我会使用
moment.localeData('zh_CN').weekdaysShort()
它总是用中文列出从周日到周六的工作日(不是按区域设置的特定顺序)。 在这种情况下,我无法为函数提供“真”值(导致错误)。

请包括使用的所有变量的值。

环境:

示例:OSX 上的 Chrome 49、Windows 7 上的 Internet Explorer 10、Ubuntu 16.0.4 上的 Node.JS 4.4.4

浏览器和操作系统对我们都很重要,特别是如果您有一个像 IOT 应用程序这样不寻常的环境。

其他可能有用的信息:

  • 运行代码的机器的时区设置
  • 代码运行的时间和日期
  • 正在使用的其他库(TypeScript、Immutable.js 等)

如果您要报告问题,请在您使用的环境中运行以下代码并包含输出:

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)

确保您的问题是孤立的。

Bug Language

最有用的评论

一个有趣的信息是weekday函数是语言环境感知的,所以

const weekdays = [0, 1, 2, 3, 4, 5, 6].map(dow => moment().locale('en-gb').weekday(dow).format('dddd'))

en-us返回['Sunday', 'Monday', ...] en-us
但是['Monday', 'Tuesday', ...]en-gb

所有7条评论

嗯,我无法重现这个。 我想你是这样说的:

moment.locale('en') //=> "en" (I don't have the locale set to zh)

// you're saying this is NOT in the right order
moment.localeData('zh_CN').weekdays(); //=> ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

//but if you change the global locale, then it is
moment.locale('zh_CN'); //=> "zh-cn"
moment.weekdays() //=> ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

如果它像你说的那样工作,我不会感到惊讶(localeData 直接获取数据,所以如果它不进行重新排序也就不足为奇了,可能我们只是没有 API获取非全局设置的语言环境的有序工作日)。 但是……上面的那些数组不是一样的吗? 我不会读或说中文,所以不知道它们是否按本地正确顺序排列,但除非我遗漏了一些东西(在查看不熟悉的字符时总是可能的),它们要么都是,要么都不是,对吧?

“en-gb”和“en-us”也是如此。

如果我的语言环境是 'en-us' 并且我想获得 'en-gb' 工作日,包括排序,我将被迫全局更改语言环境或做一些数组工作以获得排序的工作日。

moment.locale('en-us')
moment.weekdays(true) // ["Sunday", "Monday", ...

moment.locale('en-gb')
moment.weekdays(true) // ["Monday", "Tuesday", ...

moment.localeData('en-us').weekdays() // ["Sunday", "Monday", ...

moment.localeData('en-gb').weekdays() // ["Sunday", "Monday", ...

而且没有

moment.localeData('en-gb').weekdays(true)

嗯,是的,我称这是一个错误。

一个有趣的信息是weekday函数是语言环境感知的,所以

const weekdays = [0, 1, 2, 3, 4, 5, 6].map(dow => moment().locale('en-gb').weekday(dow).format('dddd'))

en-us返回['Sunday', 'Monday', ...] en-us
但是['Monday', 'Tuesday', ...]en-gb

我做了一些挖掘。

有一个不同的函数实现了<Moment>.weekdays<Locale>.weekdays (以及类似的 weekdaysMin、weekdaysShort、months、monthsShort)

如文档中所述,第一个旨在列出当前语言环境的月份或工作日。
https://momentjs.com/docs/#/i18n/listing -months-weekdays/

第二个旨在从语言环境本身获取信息。
https://momentjs.com/docs/#/i18n/locale -data/

我们可以使用相同的参数对工作日进行语言环境排序。

  • 因此, moment.localeData('en-gb').weekdays(true)将返回['Monday', 'Tuesday', ...] )。
  • 我认为这是合理的,因为此调用会在当前版本的 Moment 中引发错误。

我已经提出了 PR - 让我知道你们的想法。

是否有计划将moment().locale('en-us').weekday(0)修复

@inbalg不,那是正确的

此页面是否有帮助?
0 / 5 - 0 等级