提问人:Stavros_S 提问时间:5/31/2017 最后编辑:Stavros_S 更新时间:11/19/2023 访问量:10797
设置全局 Moment 区域设置后,Moment-Timezone 使用默认区域设置
Moment-Timezone is using default locale after global Moment locale is set
问:
我正在构建一个用 Typescript 编写的应用程序,它使用 Moment.js 和 moment-timezone 的功能。我需要本地化应用程序中的日期和时间戳,因此在主文件中,我使用设备的语言设置了时刻的区域设置。app.ts
更新:这是示例文件的要点,其中包含其他注释 https://gist.github.com/spstratis/fa853f9750a095d4acd0d1196a285be9
app.ts
import * as moment from 'moment/min/moment-with-locales';
let language = appUtil.getPhoneLanguage();
moment.locale(language);
// the expected locale is printed
console.log("Moment Locale = " + moment.locale());
问题是,在这个实用程序模块中,当我导入 moment-timezone 时,即使我在主文件中全局设置了 moment's locale,它也默认为'en'locale。app.ts
以下是我的两个实用方法,如果 moment-timezone 默认为“en”,我该如何本地化相对日期字符串和月份?
我尝试将 .locale(locale) 添加到 moment 方法中,但这并没有改变任何东西。如果我导入了 moment 而不是 moment-timezone,它适用于某些方法,但在需要使用时区实用程序的任何方法上都失败了。
date-util.ts
import * as moment from 'moment-timezone';
export function dateRelativeTime(value): string {
let timezoneId = appCache.getTimezoneId();
let localTime = _getLocalUtcDateString(value, timezoneId);
let dateMoment = moment(localTime, "MM/DD/YYYY hh:mm:ss A");
let formatedDate = dateMoment.tz(timezoneId).fromNow();
return formatedDate;
};
export function localizedMonths(): ValueList {
let m = moment("2016");
let months = new ValueList([]);
for (var i = 0; i < 12; i++) {
months.push({ ValueMember: [i + 1], DisplayMember: m.month(i).format('MMMM') });
}
return months;
};
答:
你试过吗?.format('')
moment.locale(); // en
moment().format('LT'); // 6:27 PM
moment().format('LTS'); // 6:27:51 PM
moment().format('L'); // 05/31/2017
moment().format('l'); // 5/31/2017
moment().format('LL'); // May 31, 2017
moment().format('ll'); // May 31, 2017
moment().format('LLL'); // May 31, 2017 6:27 PM
moment().format('lll'); // May 31, 2017 6:27 PM
moment().format('LLLL'); // Wednesday, May 31, 2017 6:27 PM
moment().format('llll'); // Wed, May 31, 2017 6:27 PM
更新:还要确保你的时刻库是其中有语言环境的库:https://momentjs.com/ 指定有两个时刻库,有 ( moment-with-locales.js ) 和没有语言环境 ( moment.js )。
评论
你导入的时刻错了。别这样:
import * as moment from 'moment/min/moment-with-locales';
只需这样做:
import * as moment from 'moment';
它将在您使用各个区域设置时加载它们(在 Node.js 上),然后您将共享时刻时区使用的相同时刻依赖项,因此您的全局区域设置将贯彻执行。
评论
我在 Typescript 中遇到了同样的问题。我想使用 moment-timezone 将时区设置为欧洲/布鲁塞尔并将 locale 设置为比利时荷兰语,我是这样解决的:
import 'moment/locale/nl-be';
import * as momentTZ from 'moment-timezone';
momentTZ.locale("nl-be");
momentTZ.tz.setDefault("Europe/Brussels");
如果你想在项目中使用moment,现在使用momentTZ,就像这个f.e.
const exampleDate = momentTZ().format('dddd D MMMM');
我不知道为什么,但我突然遇到了同样的问题。
在使用带有区域设置的 moment 和 moment-timezone 时,您似乎需要一些额外的配置。
以下是仅使用一种区域设置时的最低设置。
import 'moment/locale/ja' // or whatever locale you want
import moment from 'moment'
import memontTZ from 'moment-timezone'
mementTZ.defineLocale('ja', moment.localData()._config)
我相信您可以按照以下示例配置多个区域设置。
编号: https://github.com/moment/moment-timezone/issues/647#issuecomment-439600573
我们也有这个问题。这是一个非常丑陋的解决方法,因为两者都将在项目中,但包取决于包,所以我想它们都会存在。moment
moment-timezone
moment-timezone
moment
这个想法是将本地化应用于时刻,然后将其用于moment-timezone
import moment from 'moment-timezone';
import momentLocale from 'moment';
const localeLang = ‘pt’;
moment.tz.setDefault('America/Sao_Paulo');
momentLocale.locale(localeLang);
moment.localeData(localeLang);
moment.defineLocale(localeLang, momentLocale.localeData()._config);
对于多语言环境,请使用 Moment.js 自定义:
import moment from 'moment-timezone';
import momentLocale from 'moment';
import 'moment/locale/en-gb';
import 'moment/locale/es';
import 'moment/locale/fr';
import 'moment/locale/pt';
import 'moment/locale/pt-br';
const localeLang = 'pt-br';
momentLocale.locale(localeLang);
const tz = 'America/Bahia';
moment.tz.setDefault(tz);
moment.updateLocale(localeLang, momentLocale.localeData()._config);
在此之后,您应该始终导入,一切都会好起来的:moment-timezone
import moment from 'moment-timezone';
评论
localeData = moment.localeData(); localeData.months();
moment.months()