使用jquery globalize格式化moment.js + timezone

时间:2016-04-04 14:20:53

标签: javascript jquery date momentjs jquery-globalize

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

现在我想用globalize打印一个moment.js日期,所以我的第一个方法就是使用toDate() - moment.js的函数,它丢弃了时区信息(Ex 1)。当我初始化一个新的Date()并将Date-Values转换为正确的时区时,我得到了正确的结果(例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'});

2 个答案:

答案 0 :(得分: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日期提供的内容,其时区支持仅限于获取用户的本地时区偏移等等,即它没有&#39 ; t允许使用不同的时区名称或时区偏移设置日期。因此,它只允许格式化用户的本地时区(不是任意一个)。因此,我认为Globalize对于格式化日期和时间非常有用,但不是时区的一部分。如果您想了解有关Globalize时区支持的更多信息,请在https://github.com/jquery/globalize/pull/202#issuecomment-33020199找到详细信息。

使用Globalize格式化日期将为您提供符合CLDR的格式(以及最新的区域设置数据),它将为您提供运行时支持:小的最终文件大小(用于加快页面加载)和预编译格式化程序(用于更快)在客户端执行)(more info)。我希望这可以提供一些帮助,如果您有其他问题,请告诉我。

答案 1 :(得分:0)

我现在使用了一个非常hacky的方法,只是用一个函数来替换新Date的getTimezoneOffset,该函数返回由时区生成的值。

let TabBarController = self.window!.rootViewController as! UITabBarController
let navigationController = TabBarController.viewControllers![0] as! UINavigationController
let controller = navigationController.topViewController as! FirstViewController
controller.managedObjectContext = self.managedObjectContext

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