默认情况下,MomentJS / Date对象UTC

时间:2019-07-02 06:23:04

标签: javascript angular typescript datetime momentjs

我在我的角度项目中使用MomentJS,但是在不同日期时区存在很多问题。

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

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

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

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

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

现在我在.toUTCString()之后一直使用new Date(),但是我的解决方案中有大量的日期变量,因此确保所有内容都包含.toUTCString()并不是一件好事一直以来,如果另一个开发人员错过了它,将会引起问题。我正在尝试找到一种在项目级别对此进行标准化的方法。

我的主要问题是momentJS比较方法.isBefore().isSame().isAfter()。因为当比较发生时,我所有的日期都包含不同的小时和不同的时区,所以它将考虑到它们,而不会表现出我希望它们的行为。

2 个答案:

答案 0 :(得分: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)中以便被实例化。

答案 1 :(得分:1)

您可以尝试通过 UTC模式使用力矩:

| Product ID | Making Cost | Tax 1 | Tax 2 | MRP | Selling Price | |------------|-------------|-------|-------|-----|---------------| | 12345 | 50 | 20 | 30 | 100 | 80 | | 23456 | 50 | 60 | 30 | 100 | 80 | | 34567 | 50 | 60 | 70 | 100 | 100 |

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

let m = moment().utc()

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

m.startOf('day')

,如果打印出来,它将是这样的:

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

您也可以使用本机 Date 来实现,但是您必须编写一堆moment.js已经拥有的代码...

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

供参考,请在这里查看: https://momentjs.com/docs/#/parsing/utc/

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