moment.js和moment.timezone.js - 我怎么知道客户端时区在本地tz中显示UTC日期?

时间:2015-09-09 04:13:10

标签: javascript momentjs

我查看了这些帖子 - 以及阅读文档; Create a local date from a UTC date string in Moment.jsChanging the Utc Date to Local Date using moment.js

我仍然不会放弃得到我想要的东西。

数据库中的所有日期都以UTC格式存储,但我希望客户端能够查看当地时间的日期 - 但是时区也是如此。

我可以获得.local(),但是这会削减区域信息,我可以得到我想要的结果如果我指定时区,但我不会知道时区...不是那个时刻/时区应该给出的东西之一?我可以得到偏移量 - 但是文档没有说明如何使用它。

示例(这就是我想要的):9月8日15日,晚上10:51 CDT

以下是我尝试过的示例。

// I spoof a date as if it came from the db (for demo purposes)
var now = new Date().toUTCString();

// now outputs.. I am in CDT (-0500)
document.write( now ); 
    // Wed, 09 Sep 2015 03:51:15 GMT

document.write( moment( now ).format('MMM Do YY, h:mm a z') );
    // Sep 8th 15, 10:51 pm

document.write( moment( now ).local().format('MMM Do YY, h:mm a z') );
    // Sep 8th 15, 10:51 pm  (same as above, so I'm unclear what 'local()' gives me that I didn't already have?)

document.write( moment( now ).tz('America/Chicago').format('MMM Do YY, h:mm a z') );
    // Sep 8th 15, 10:51:15 pm CDT 

最后一个是我正在追求的...但我不知道tz,所以我甚至无法将其设置为变量并将其传入,如何将时区作为字符串获取,而不是和偏移 - 或者如何使用偏移来做同样的事情?         // 9月8日15点,晚上10:51 CDT

1 个答案:

答案 0 :(得分:1)

您可以使用类似jsTimezoneDetect的内容手动获取IANA时区标识并将其附加到字符串中。但是,我不知道图书馆有多可靠,所以这不是认可。

以下只是一个示例,一个健壮的函数需要对来自 jstz.determine 的返回值进行一些验证和错误处理。

这看起来有点奇怪,我更习惯于将实际时区视为+05:30或其他什么。

IANA时区不是为一般用途而设计的,并且存在向单个地理位置提供实际覆盖广阔区域的问题。



document.write(moment().format('d MMM YYYY HH:mm:ss') + ' ' + jstz.determine().name());

<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
&#13;
&#13;
&#13;