2017-02-23 54 views
1

我有一个日期(以UTC毫秒为单位),我在页面上显示(AngularJS 1.4.0),并且用户希望在东部时间看到它,而不管时区在他们的电脑上设置。调整为夏令时的日期过滤器

我使用日期过滤器,并从documentation我看到

$filter('date')(date, format, timezone)

时区将用于格式化。它了解UTC/GMT和美国大陆时区的缩写,但对于一般用途,请使用时区偏移量,例如'+0430'(格林尼治子午线以东4小时30分钟)如果未指定,浏览器的时区将使用。

使用时间戳从今天起,如果我使用类似

{{ record.Timestamp | date:'HH:mm:ss.sss':'EST' }}

,因为我希望它写入时间,但我想我会用一个小时处于关闭状态时,DST来临时。我也可以指定'EDT',它会提前一个小时的时间,但是有没有可以使用的时区缩写,意思是“Eastern”,并且使用日期本身来确定是使用EST还是EDT?或者我需要检查日期并自己创建一个偏移量:取决于日期是-0500/EST还是-0400/EDT? (它看起来像timezone只能是一个字符串,而不是一个函数,所以这会使我的自动检测复杂化)。

任何人想要将显示硬编码为EST或EDT似乎都不太可能 - 他们更希望将时区调整为DST。

+0

问题在于夏时制没有普遍遵守。否则,您可以从一月的日期和七月再次检查'getTimezoneOffset()',并比较当前日期的偏移量,然后适当地使用'EDT'或'EST'。但是,如果代码将运行在亚利桑那州或夏威夷州,那么这是行不通的。 –

+0

这听起来更像是一个问题,可能的解决办法比原来的问题,对不对?我可能会尝试类似的东西来确定DST,现在我们不会有任何用户在这些领域,但_永远不会说_... – Danny

+0

取决于你认为的“原始问题”:)。对我而言,真正的问题是日期过滤器使用美国时区缩写,而不是更为标准的[IANA列表](https://www.iana.org/time-zones/repository/tz-link.html),不指定DST。我赞同Yaser对MomentJS的回答。 –

回答

1

我会使用Moment.jsMoment Timezone这种东西来获得正确的日期时间。 AngularJS中的过滤器只是格式化日期时间对象并在UI中显示它。

您也可以使用一些准备使用的指令,如Angular-Moment。 它有各种可用的过滤。

+0

那么,我*只是试图格式化日期时间在UI中显示 - 这纯粹是表示。我会研究'momentjs',但我不愿意为这件作品添加另外几个库。除了Angular日期过滤器之外,'timezone'还不错 - 我现在可以用UTC显示它! - 但实际时区似乎有点欠缺。 – Danny

+0

momentjs已经有一段时间了,它有一些很棒的功能。你是正确的添加另一个库,但我不认为这是一个大问题,我已经在几个项目中使用的时刻,它的工作原理完美 – Yaser

+0

我抵制,但与DST快速接近我已经在角时刻。 JS,它似乎运作良好。 – Danny