【问题标题】:MomentJS/Date object UTC by defaultMomentJS/Date 对象默认 UTC
【发布时间】:2019-11-12 17:55:33
【问题描述】:

我在我的 Angular 项目中使用 MomentJS,但我在不同的日期时区遇到了很多问题。

我的应用程序不应该考虑任何时区,但是我的后端 api 和前端之间的这种混乱,当我将标准时刻对象发送到 c# 后端时,它默认将其转换为 UTC,我总是得到日期 -1 天。

我可以将 MomentJS 或 javascript Date 对象设置为始终默认为 UTC 并忽略小时/分钟/秒吗?

当我这样做时:moment() 它会根据时区和当前小时填充今天的值。

我想让moment() 在我的整个应用程序中始终具有 UTC 值,并且时间始终为 00:00:00。

是否也可以使用 new Date() 来实现这一点?

现在我一直在使用.toUTCString()new Date() 之后,但我的解决方案中有大量日期变量,确保所有内容都始终有.toUTCString() 并不是真的可以,如果另一个开发人员错过了这一点,这将导致问题。我正在尝试找到一种在项目级别对其进行标准化的方法。

我的主要问题是 momentJS 比较方法 .isBefore().isSame().isAfter()。因为当比较发生时,我所有的日期都包含不同的时间和不同的时区,所以它会考虑到它们,而不是按照我想要的方式行事。

【问题讨论】:

    标签: javascript angular typescript datetime momentjs


    【解决方案1】:

    您可以将moment-timezonemoment 一起使用。

    然后使用以下代码设置默认UTC 时区:

    import * as moment from 'moment-timezone';
    ...
    moment.tz.setDefault('Etc/UTC');
    

    Angular 中的一个可能选项是创建一个单例实例 LocaleService 来管理与本地化相关的参数。

    import { Injectable } from '@angular/core';
    import * as moment from 'moment-timezone';
    
    @Injectable({
      providedIn: 'root'
    })
    export class LocaleService {
    
      constructor() {
        this.setDefaultTimezone();
      }
    
      setDefaultTimezone() {
        moment.tz.setDefault('Etc/UTC');
      }
    
      // other stuff related to localization
      ...setCurrentTimezone()
      ...setLocale()
    }
    

    然后,我们需要通过AppModule提供这个服务,并且不要忘记将它注入到一个全局组件中,例如AppComponent,以便被实例化。

    【讨论】:

    • 这会在全球范围内发挥作用吗?我尝试在 app.component.ts 中调用它,但是当我在另一个组件中使用时刻对象时,它仍然默认为我的时区而不是 UTC。
    • 它不会改变现有的时刻实例,但如果你创建了一个新的就可以了。 [momentjs.com/timezone/docs/#/using-timezones/default-timezone/…doc)
    • 答案已更新。最好的办法是将此代码放入一个单例实例 LocaleService 中,该实例负责将默认语言环境设置为 UTC,以及与本地化相关的其他内容。这个全局服务被导入到AppModule
    【解决方案2】:

    您可以尝试以这种方式在UTC模式中使用时刻:

    let m = moment().utc()

    然后,要将时间重置为当天的午夜,您可以调用此方法:

    m.startOf('day')

    您也可以将它们链接在一起:

    let m = moment.utc().startOf('day')

    如果你打印它,它会是这样的:

    console.log(m.format())
    // 2019-07-02T00:00:00Z
    

    你也可以用原生的Date来做,但是你得写一堆momentjs已经有的代码……

    我希望这能回答你的问题!

    请看这里: https://momentjs.com/docs/#/parsing/utc/

    这里: https://momentjs.com/docs/#/manipulating/start-of/

    【讨论】:

    • 谢谢,这也很有帮助!但我会选择上面的答案,因为它可以帮助我在项目级别定义默认 TZ。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2021-09-29
    相关资源
    最近更新 更多