javascript - MomentJS/Date-objekt UTC som standard


Jag använder MomentJS i mitt Angular-projekt och jag har många problem med olika tidszoner.

Min app bör inte ta hänsyn till några tidszoner, men detta kaos mellan min backend-API och frontend, när jag skickar standard moment-objekt till C#-backenden konverterar den det till UTC som standard och jag får alltid datumen med -1 dag.

Kan jag ställa in MomentJS eller JavaScript Date-objektet så att det alltid som standard använder UTC OCH ignorerar timmar/minuter/sekunder?

När jag gör: moment() fylls det med dagens värde baserat på tidszon och baserat på aktuell timme.

Jag vill att moment() alltid ska ha UTC-värde och att tiden alltid ska vara 00:00:00 i hela min app.

Är det också möjligt att uppnå detta även med new Date()?

Just nu har jag alltid använt .toUTCString() efter new Date() men jag har massor av datumvariabler i min lösning och det är inte riktigt okej att alltid se till att allt har .toUTCString() efter sig, om en annan utvecklare missar detta kommer det att orsaka problem. Jag försöker hitta ett sätt att standardisera detta på projektnivå.

Mitt största problem är med momentJS jämförelsemetoder .isBefore(), .isSame(), .isAfter(). Eftersom alla mina datum innehåller olika timmar och olika tidszoner kommer jämförelsen att ta hänsyn till dem och inte fungera som jag vill.

Svar #1

Du kan använda moment-timezone med moment.

Och sedan ställer du in standardtidszon UTC med koden nedan:

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

Ett möjligt alternativ i Angular kan vara att skapa en singleton-instans LocaleService för att hantera lokaliseringsrelaterade parametrar.

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()
}

Och sedan behöver vi tillhandahålla denna tjänst via AppModule, och glöm inte heller att injicera den i en global komponent, till exempel AppComponent, för att kunna instansieras.

Svar #2

du kan försöka använda moment i UTC-läge på detta sätt:

let m = moment().utc()

då, för att återställa tiden till midnatt den dagen kan du kalla på denna metod:

m.startOf('day')

du kan också kedja ihop allt detta:

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

och om du skriver ut det kommer det att vara något som:

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

Du kan också göra det med den inbyggda Date, men du kommer att behöva skriva en massa kod som momentjs redan har...

Jag hoppas att detta besvarar dina frågor!

för referens, ta en titt här: https://momentjs.com/docs/#/parsing/utc/

och här: https://momentjs.com/docs/#/manipulating/start-of/

Relaterade artiklar