1

我使用 moment.js + timezone 来处理日期和时间对象,并使用 globalize 向用户显示数字、货币等。

现在我想用 globalize 打印一个 moment.js 日期,所以我的第一种方法是只使用 moment.js 的 to getDate()-function,它不幸地丢弃了时区信息(Ex 1)。当我使用转换为正确时区的日期值初始化一个新的 Date() 时,我得到了正确的结果(Ex 2),但是当我使用完整版本时,它显示时区 UTC(这显然不正确)。有没有办法让这些组件一起工作?

var m = moment.tz(1459779436, 'Europe/Berlin');
// Ex 1: Date is printed in UTC, so with an offset of 2 hours
globalize.formatDate(m.getDate(), {datetime: 'full'});
globalize.formatDate(new Date(m.toISOString()), {datetime: 'full'});
// Ex 2: Correct times are printed, but with wrong timezone
globalize.formatDate(new Date(m.year(), m.month(), m.date(), m.hour(), m.minute(), m.seconds(), m.milliseconds()), {datetime: 'full'});
4

2 回答 2

0

我现在使用了一种非常老套的方法,只需将新 Date 的 getTimezoneOffset 替换为一个返回由时刻时区生成的值的函数。

function momentToDate(input) { // Do NOT use the result to anything else than passing it into globalize
    var res = new Date(input.year(), input.month(), input.date(), input.hour(), input.minute(), input.seconds(), input.milliseconds());
    var offset = input.utcOffset();
    res.getTimezoneOffset = function() {
        return offset;
    }
    return res;
}

因此 globalize 将打印正确的日期和正确的时区偏移量。

于 2016-04-08T08:25:01.093 回答
0

Globalize 将在即将发布的 1.3 版中支持 IANA 时区!

npm install globalize@1.3.0-alpha.0 cldr-data iana-tz-data

然后

var Globalize = require( "globalize" );
Globalize.load( require( "cldr-data" ).entireSupplemental() );
Globalize.load( require( "cldr-data" ).entireMainFor( "en" ) );
Globalize.loadIANATimezone( require( "iana-tz-data" ) );

Globalize( "en" ).formatDate(new Date(), {datetime: "short", timeZone: "America/Los_Angeles"});
// > '3/19/17, 3:19 PM'
Globalize( "en" ).formatDate(new Date(), {datetime: "short", timeZone: "America/New_York"});
// > '3/19/17, 6:19 PM'
Globalize( "en" ).formatDate(new Date(), {datetime: "short", timeZone: "America/Sao_Paulo"});
// > '3/19/17, 7:19 PM'
Globalize( "en" ).formatDate(new Date(), {datetime: "short", timeZone: "Europe/Berlin"});
// > '3/19/17, 11:19 PM'

Globalize( "en" ).formatDate(new Date(), {datetime: "full", timeZone: "America/Los_Angeles"});
// > 'Sunday, March 19, 2017 at 3:19:22 PM Pacific Daylight Time'
Globalize( "en" ).formatDate(new Date(), {datetime: "full", timeZone: "America/New_York"});
// > 'Sunday, March 19, 2017 at 6:19:22 PM Eastern Daylight Time'
Globalize( "en" ).formatDate(new Date(), {datetime: "full", timeZone: "America/Sao_Paulo"});
// > 'Sunday, March 19, 2017 at 7:19:22 PM Brasilia Standard Time'
Globalize( "en" ).formatDate(new Date(), {datetime: "full", timeZone: "Europe/Berlin"});
// > 'Sunday, March 19, 2017 at 11:19:53 PM Central European Standard Time'

PS:请注意,它还支持在特定 IANA 时区解析日期字符串。

详细信息在这里https://github.com/globalizejs/globalize/pull/701#issuecomment-287652673


老答案:

您可以使用 moment.js 进行日期操作并使用 Globalize 来格式化没有时区部分的日期,即您的第二个示例{datetime: "medium"}[1]。这对你可行吗?或者,您可以使用它加上 moment.js 为您打印时区名称吗?

1:请注意,如果您需要不同/自定义模式,您可以使用{skeleton: <pattern>}.

正确答案

全球化时区支持仅限于原生 JavaScript Date 提供的内容,其时区支持仅限于获取用户的本地时区偏移量,仅此而已,即它不允许使用不同的时区名称或时区偏移量设置日期。因此,它只允许格式化用户的本地时区(不是任意的)。因此,我相信 Globalize 对您格式化日期和时间很有用,但对它的时区部分没有用。如果您想了解更多关于 Globalize 时区支持的信息,请在https://github.com/jquery/globalize/pull/202#issuecomment-33020199找到详细信息。

使用 Globalize 格式化日期将为您提供符合 CLDR 的格式(以及最新的语言环境数据),并且将为您提供运行时支持:小的最终文件大小(用于更快的页面加载)和预编译的格式化程序(用于更快地在客户端执行)(更多信息)。我希望这可以有所帮助,如果您还有其他问题,请告诉我。

于 2016-04-05T14:33:02.907 回答