我在我的角度项目中使用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()
。因为当比较发生时,我所有的日期都包含不同的小时和不同的时区,所以它将考虑到它们,而不会表现出我希望它们的行为。
答案 0 :(得分:1)
您可以将moment-timezone与moment
一起使用。
然后使用以下代码设置默认的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/