【问题标题】:How to set application wide timezone in angularjs using momentjs如何使用 momentjs 在 angularjs 中设置应用程序范围的时区
【发布时间】:2018-02-20 12:13:08
【问题描述】:

我有一台服务器将时间戳存储在一个时区,而用户则生活在另一个时区。我的印象是momentjs timezone 充当了一种装饰器,如果我定义了一个时区

moment.tz.setDefault("Europe/Copenhagen"); 

那么随后使用时刻函数将使用定义的时区

var date = moment(timestamp_from_server).calendar()

在我的情况下,为所有时间戳添加一小时。但这显然行不通。

是否可以设置“全局”或应用程序范围的时区,这样我就不必转换代码中的每个时间戳,而可以依赖 momentjs 方法?任何建议,以及替代方案都受到高度赞赏。

注意:我正在使用 AngularJS,在

中设置时区
app.run(function(...) {
  ...
  moment.tz.setDefault("Europe/Copenhagen")
})

但我认为这并不重要。

【问题讨论】:

    标签: javascript angularjs timezone momentjs


    【解决方案1】:

    您可以使用angular moment 实现此目的

    如果你不想使用这个模块

    1. 您可以为 momentjs 创建工厂或服务,并使用依赖注入在应用程序的任何地方使用
    2. 创建一个将设置默认时区的装饰器,这将有助于在整个应用程序中保持一致的时区。

    基于 cmets 更新:

    如果您从头开始一个新项目,使用angular moment 可能会更容易 否则decoratorapp.runsetting in service 本身非常简单。但是在现有项目中应用时区时,请确保时区的更改不会影响使用 momentjs 的现有日期函数

    使用工厂设置默认时区的简单实现

    由于工厂是单例的,所以只会创建一个

    https://embed.plnkr.co/wmv11KEuJt6XJvgs5eY8/

    【讨论】:

    • 嘿塞缪尔,这是一个极简主义的答案 :) 真的很感激,但究竟如何?我在 angularjs 中使用 momentjs 没有问题(这就是为什么我的意思是 angular 对这个问题根本不重要,你在编辑中强调了 angular 一点)但是除了提供一些有用的过滤器之外,我看不到任何使用的理由角力矩。为什么会有任何不同?
    • @davidkonrad 除了有用的过滤器和指令之外,这个模块还有助于拥有一致的应用范围时区configuration。以便您可以轻松转换服务器时间戳。
    • @davidkonrad 我已根据您的评论更新了答案
    • 如果您只需要在工厂中应用时区,那么您可以这样做,因为服务是单例的,您可以在该服务本身设置时区。如果您为整个应用程序选择设置,则需要考虑副作用
    • app.run() 中设置tz.setDefault() do 实际上在应用程序范围内工作,只记得使用moment().local() (!!) 我试过angular-moment 但是一个大 缺点是过滤器不能被链接,即{{ date | amLocal | amCalendar }} 不起作用。它也完全接管了时刻,您需要通过角矩本身进行定位/ tz 等,所以放弃了这个想法,我只是将我所有的moment() 引用更改为moment().local()。无论如何都接受答案,如果您从头开始一个新项目可能使用angular-moment .. 会更容易或更直观,
    猜你喜欢
    • 2012-12-20
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2016-08-02
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多