Moment: 从Date.prototype.toString()中找不到时区缩写

创建于 2012-02-06  ·  33评论  ·  资料来源: moment/moment

您好,当我遇到单元测试时,我通过一个论坛遇到了moment.js网站,并单击了它的方式-两次测试都失败了,我想在这里报告:

用户代理:
Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 535.7(KHTML,Gecko一样)Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

时区:
UTC + 1

测试失败(#28):
http://pastebin.com/bQsDuxdH

*标题由timrwood编辑

最有用的评论

愚蠢的问题:为什么要使用全新的图书馆? 时刻解决所有人的日期和时间处理需求不是重点吗? 尽管数据文件增加了很少的空间(我可以理解将它们分开),但是新库本身的大小不到2k,因此空间似乎并不是分离它的原因。

只是想生成一个带有时区的日期字符串的人不得不下载两个单独的库和一个数据文件来执行Java内置的功能,这似乎有点可悲。

另外,如何使用这种新的库合并生成简单的日期字符串? 在生成之前:

Sun, 06 Nov 1994 08:49:37 GMT

与:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

但是现在,我对没有“ z”格式设置选项的情况应该怎么做感到困惑。 任何帮助,将不胜感激。

所有33条评论

嗯,时区缩写似乎失败了。 抱歉,无法进行远程调试,但是chrome中以下内容的输出是什么?

new Date().toString()

另外,您所在时区的名称是什么?

我在单元测试中遇到了相同的错误,我也在UTC + 1 (以前称为GMT + 1)中。

新的Date()。toString()在Firefox 10中显示“ 2012年2月11日星期六,格林尼治标准时间+0100”,在Chrome中显示“ 2012年2月11日星期六,格林尼治标准时间+0100(欧洲标准时间)” 16和Internet Explorer 9中的“星期六2012年2月11日02:18:59 UTC + 0100”

嗯,我怕这个。 问题在于Date.prototype.toString返回的结果不同。 这是获取时区名称(PST,CST,EST等)的唯一位置。 如果此方法未返回任何时区信息(与FF10和IE9一样),则无法获取它。

也许是时候贬值了? 还是只注意到文档中的问题是可以接受的吗?

4318通过,2失败。 2715毫秒。

Mozilla / 5.0(Windows NT 6.1)AppleWebKit / 535.11(KHTML,例如Gecko)Chrome / 17.0.963.56 Safari / 535.11

UTC +2(乌克兰基辅)

格式时区2已通过,2失败。
--->类似“ PST”的东西
AssertionError:--->类似于“ PST”
在Object.ok(http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
在http://momentjs.com/js/tests.js?_=120203_183019:2413:14
在Object.runTest(http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
在http://momentjs.com/js/tests.js?_=120203_183019:1748:25
在http://momentjs.com/js/tests.js?_==120203_183019:1006:13
在http://momentjs.com/js/tests.js?_=120203_183019:616:13
在http://momentjs.com/js/tests.js?_=120203_183019:627:25
在http://momentjs.com/js/tests.js?_=120203_183019:1008:17
在http://momentjs.com/js/tests.js?_=120203_183019:1589:17
--->类似“ PST”的东西
AssertionError:--->类似于“ PST”
在Object.ok(http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
在http://momentjs.com/js/tests.js?_=120203_183019:2414:14
在Object.runTest(http://momentjs.com/js/tests.js?_=120203_183019:1702:9)
在http://momentjs.com/js/tests.js?_=120203_183019:1748:25
在http://momentjs.com/js/tests.js?_==120203_183019:1006:13
在http://momentjs.com/js/tests.js?_=120203_183019:616:13
在http://momentjs.com/js/tests.js?_=120203_183019:627:25
在http://momentjs.com/js/tests.js?_=120203_183019:1008:17
在http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02:00 --->类似于“ +07:30”
+0200 --->类似于“ +0700”

我也通过了同样的#28测试失败。我的时区是GMT -3。

代理商:
Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 535.11(KHTML,例如Gecko)Chrome / 17.0.963.66 Safari / 535.11

测试失败: http :

。:。

代理商:
Mozilla / 5.0(Windows NT 6.1; WOW64; rv:10.0.2)Gecko / 20100101 Firefox / 10.0.2
要么
Mozilla / 5.0(兼容; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4。 0C; Zune 4.7; .NET4.0E)

测试失败: http

因此,这似乎发生在UTC + 1,UTC + 2和UTC-3中。

不幸的是,现在有解决此问题的方法。 这取决于破解Date().toString()输出,并且如果该字符串中没有可用的时区信息,则无法获取该信息。

我将贬低此功能,并可能使插件的结果更可靠(尽管准确性可能更低)。 它可能应该像https://github.com/mde/timezone-js。

从1.6.0版开始,不建议使用z zz令牌。 因此,我正在关闭此问题。

那node.js呢? z zz在这种环境下是否可靠?

它们已正式弃用,因此从1.6.0版开始将不起作用。

对于之前的代码版本,我认为结果也将不一致,因为Node使用V8,而上面的某些不一致结果是在Chrome中也使用V8。

谢谢。 因此,对于像Thu Jan 10 2013 22:54:11 GMT+0100 (CET)这样的字符串,我最终要做的是使用正则表达式删除时区字符串(此处(CET)的前导空格),仅保留时移信息(此处+0100 )。 您是否认为对于moment.js足够了,还是我会冒不一致的风险?

嗯,我不确定您要做什么,是要获取CET还是+0100吗?

+0100通过ZZ令牌(请注意大写)得到支持,并且在解析和格式化时可以正常工作。

已弃用CET ,因为我们无法可靠地从Date.toString获取它。 但是,由于我们将Date.getTimezoneOffset用于+0100 ,因此支持更加一致。

正如您所说,我正在使用ZZ表示+0100,并从要分析的字符串中删除了CET。 是否有意义 ?

抱歉,我仍然不明白问题出在哪里。 您是否要解析Thu Jan 10 2013 22:54:11 GMT+0100 (CET) ? 您应该能够执行以下操作。

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

这正是我最后要做的。 看来您是在确认我在做正确的事。 我的歉意如果我不清楚,谢谢您的回答!

没问题!

@ hughanderson4 ,问题在于浏览器并不总是返回Date.prototype.toString的时区缩写。 由于我们无法可靠地获取时区缩写,因此已弃用。

从那时起,创建了moment-timezone来添加对moment.js的时区支持。 您可能需要调查一下是否符合您的需求。

如何将moment.utc()转换为本地时间并显示时区缩写?

愚蠢的问题:为什么要使用全新的图书馆? 时刻解决所有人的日期和时间处理需求不是重点吗? 尽管数据文件增加了很少的空间(我可以理解将它们分开),但是新库本身的大小不到2k,因此空间似乎并不是分离它的原因。

只是想生成一个带有时区的日期字符串的人不得不下载两个单独的库和一个数据文件来执行Java内置的功能,这似乎有点可悲。

另外,如何使用这种新的库合并生成简单的日期字符串? 在生成之前:

Sun, 06 Nov 1994 08:49:37 GMT

与:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

但是现在,我对没有“ z”格式设置选项的情况应该怎么做感到困惑。 任何帮助,将不胜感激。

因此,要求确保我理解:是否可以替代不推荐使用的“ z”格式?

如果我有ISO-8601格式的时间戳,例如:

2014-07-25T18:00:00-04:00

我想将此时间戳显示为以下内容:

6:00 PM EST

时刻不再支持这种格式吗? 所有时区数据都包含在我的时间戳中,我只想直接显示它而不以任何方式转换时区。

这实际上不包括时区。 可能有多个时区名称对应于相同的UTC偏移量,尤其是在考虑更改DST的可能性时。 您无法从“ UTC-4:00”推断时区为EST。

为了澄清起见,当使用带有特定时区的moment-timezone时z格式化程序仍然有效-因为可以从时区数据中提取缩写。

现在就提一下-如果您使用
new Date().toTimeString()
据我所试,您在所有浏览器中都得到相同的结果。

这意味着您可以使用此字符串提取时区,不是吗?

嗨,我看到上面的format('z')已过时。 同样在文档中,我看到它已经从1.6.0中弃用了。 我现在使用2.11.0,我可以使用'z'来显示基于偏移量的时区(PST / PDT)。
我现在不应该在代码中不使用这个“ z”吗? 您能告诉我确切的替代方法来显示PST而不是-/ + 8

@themakshter-不,在所有浏览器中都不会得到相同的结果。 操作系统,浏览器版本和语言在其中扮演着重要角色-规范中没有一致性要求。

@ Shobana16-如果只执行moment().format('z') ,它将始终返回""

如果您使用moment-timezone,并执行类似moment.tz('America/Los_Angeles').format('z') ,那么您将获得有效的响应。

z可以使用moment-timezone。 在平淡的时刻它什么也没做。

感谢您对MJ的评论。 是的,我仅在带有矩时区的地方使用“ z”。 好的,很酷,我的代码将继续带有“ z”。 !

只需添加一条便条,从0.5.0时区开始,您就可以在当地时区_guess_打开,这为以下情况打开了大门:

var abbreviation = moment.tz(moment.tz.guess()).format('z');

可以,但是请注意:

  1. 只是个猜测而已。 可能会猜错。
  2. 如果确实猜错了,那么该缩写仍有可能是正确的,因为许多相似的时区将使用相同的缩写,例如Europe/ParisEurope/Berlin都如何使用CETCEST
  3. 但是,没有任何保证。 如果猜错了,则您可能会输入错误的缩写。

我们可能还会考虑修改一下moment.js,以便如果moment-timezone可用,它可以尝试自动执行此操作以重新启用z格式化程序。 尽管目前还没有发生。

var abbreviation = moment.tz(moment.tz.guess()).format('zz');似乎不起作用(有两个z )。 我只能检索“ EDT”而不是“东部夏令时间”吗?

谢谢!

啊,我发现http://momentjs.com/timezone/docs/#/using -timezones / formatting /说:要提供长格式名称,您可以覆盖moment.fn.zoneName并使用zz令牌。
[and much more...]
谢谢。

一件事虽然令人困惑。 在当前版本中(或声明为“自1.6.0开始”),如果不使用单独的moment-timezone,则无法显示时区。 但是,当我执行moment(...).toString()最后会显示例如GMT 。 那么这是一个错误,还是一个解决方案与另一个功能矛盾?

一件事虽然令人困惑。 在当前版本中(或声明为“自1.6.0开始”),如果不使用单独的moment-timezone,则无法显示时区。 但是,当我执行moment(...).toString()最后会显示例如GMT 。 那么这是一个错误,还是一个解决方案与另一个功能矛盾?

我认为问题是可靠性。 Moment无法可靠地从本地日期对象中提取正确的时区,因此它不再支持z/zz的格式。

上面讨论过:
https://github.com/moment/moment/issues/162#issuecomment -4060027

这是因为我们已弃用z这对我们获取“ GMT”文本有效

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

它将生成20 May 2020 08:15 AM GMT+0300"

此页面是否有帮助?
0 / 5 - 0 等级