Which @angular/* package(s) are the source of the bug?
common
Is this a regression?
Yes
Description
In the date when was changed winter time to summer time, the formating for specific hour(01:00 is the same like 02:00 ) does not work correctly..
My timezone in windows is UTC+1 - Prague - here the datepipe does not work correctly.. If I set it in windows timezone UTC, it is ok...
toISOString | UTC | +0000 | +0060
2022-03-27T00:00:00.000Z | 3/27/22, 12:00 AM | 3/27/22, 12:00 AM | 3/27/22, 1:00 AM
2022-03-27T01:00:00.000Z | 3/27/22, 1:00 AM | 3/27/22, 1:00 AM | 3/27/22, 3:00 AM
2022-03-27T02:00:00.000Z | 3/27/22, 3:00 AM | 3/27/22, 3:00 AM | 3/27/22, 3:00 AM
2022-03-27T03:00:00.000Z | 3/27/22, 3:00 AM | 3/27/22, 3:00 AM | 3/27/22, 4:00 AM
2021-03-28T00:00:00.000Z | 3/28/21, 12:00 AM | 3/28/21, 12:00 AM | 3/28/21, 1:00 AM
2021-03-28T01:00:00.000Z | 3/28/21, 1:00 AM | 3/28/21, 1:00 AM | 3/28/21, 3:00 AM
6条答案
按热度按时间gtlvzcf81#
这是因为参数“timezone”目前只接受UTC偏移量,而不是实际的时区。由于夏令时(DST),提供这个偏移量目前是没有意义的。目前有一个拉取请求(Pull Request),它允许提供一个时区名称而不是一个偏移量。
rwqw0loc2#
你可以使用以下代码将UTC时间加上1小时偏移量:
这将返回格式化后的UTC时间,例如:
gfttwv5a3#
问题是,目前默认的Angular DatePipe与时区一起使用会改变提供的日期,通过添加1970年1月1日(+01:00)与计算机本地时区的时区偏移量之间的差异(在冬季提供的时间是60分钟,夏季是120分钟)。
这意味着DatePipe在夏令时(DST)时会出现错误。
目前,您需要使用自己的DatePipe,该DatePipe使用Intl API或类似moment-timezone的内容。
顺便说一下,这个方法可以正常工作:
{{date.toLocaleString(undefined, {timeZone: "Etc/GMT-1"})}}
cwxwcias4#
我正在使用自己的datepipe,所以当我测试它时:
对我来说是有效的。日期现在是正确的。但是我需要设置一个datetimeformat,因为:
我没有找到可以在date.toLocaleString(undefined, {timeZone: "Etc/GMT-1"})中设置格式的方法。同时,要使用第一个参数也是不可能的,因为本地字符串无法实现,因为我需要芬兰语格式来满足芬兰语和英语本地化的需求。
对我来说,使用moment的解决方案是可行的:
pqwbnv8z5#
刚刚遇到了同样的问题...
在格式Date的这个点上,确实会考虑基于计算机的时区偏移量。
htzpubme6#
请随时订阅 #54470 以获取有关该主题的任何更新。我们目前正在调查使用
Intl
API 进行日期格式化。