typescript Moment-Timezone在设置全局Moment区域设置后使用默认区域设置

hgc7kmma  于 2023-11-20  发布在  TypeScript
关注(0)|答案(6)|浏览(207)

我正在构建一个用Typescript编写的应用程序,它使用Moment.js和moment-timezone的功能。我需要应用程序中的日期和时间戳本地化,因此在主app.ts文件中,我使用设备的语言设置moment的区域设置。

更新:以下是示例文件的要点,并附有注解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时,它默认为'en' locale,即使我在主app.ts文件中全局设置了moment的locale。
下面是我的两个实用程序方法,如果moment-timezone默认为'en',我如何本地化相对日期字符串和月份?
我尝试在moment方法中添加.locale(locale),但这并没有改变任何东西。如果我导入moment而不是moment-timezone,这对某些方法有效,但在需要使用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;
};

ffvjumwh

ffvjumwh1#

我在Typescript中遇到了同样的问题。我想使用moment-timezone将时区设置为欧洲/布鲁塞尔,并将locale设置为比利时荷兰语,我这样解决了它:

import 'moment/locale/nl-be';
import * as momentTZ from 'moment-timezone';
momentTZ.locale("nl-be");
momentTZ.tz.setDefault("Europe/Brussels");

字符串
现在使用momentTZ如果你想在你的项目中使用moment,就像这样。

const exampleDate = momentTZ().format('dddd D MMMM');

oogrdqng

oogrdqng2#

我们也遇到了这个问题。这是一个相当丑陋的解决方案,因为momentmoment-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);

字符串

fgw7neuy

fgw7neuy3#

你输入的时机不对。不要这样做:

import * as moment from 'moment/min/moment-with-locales';

字符串
就这么做:

import * as moment from 'moment';


它将在您使用它们时加载各个区域设置(在Node.js上),然后您将共享moment-timezone使用的相同时刻依赖,因此您的全局区域设置将继续。

0h4hbjxa

0h4hbjxa4#

你试过.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

字符串

更新:还要确保你的moment库是带有locale的:https://momentjs.com/指定了两个moment库,带(moment-with-locales.js)和不带locale(* moment.js *)。

vwoqyblh

vwoqyblh5#

对于多语言环境,使用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';

个字符
在这之后,你应该总是导入moment-timezone,一切都会好起来的:

import moment from 'moment-timezone';

z9zf31ra

z9zf31ra6#

我不知道为什么,但我突然有了同样的问题。
在使用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

相关问题