Moment Js UTC na czas lokalny


145

Próbuję przekonwertować czas UTC na czas lokalny. Podążałem za tym przykładem z tego linku: http://jsfiddle.net/FLhpq/4/light/ . Nie mogę uzyskać odpowiedniego lokalnego wyjścia. Na przykład, jeśli jest tutaj 10:00 rano, zamiast 10:30, otrzymam 15:30. Oto mój kod:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

var localTime  = moment.utc(date).toDate();

localTime = moment(localTime).format('YYYY-MM-DD HH:mm:ss');

console.log("moment: " + localTime);

Bez względu na to, co robię, czas zawsze wychodzi w czasie UTC. Mieszkam w Houston, więc wiem, że strefa czasowa jest problemem. Postępowałem zgodnie z kodem w linku, ale wydaje mi się, że mam czas lokalny. Co ja robię źle?

Odpowiedzi:


238

Aby przekonwertować czas UTC na lokalny, musisz użyć moment.local().

Więcej informacji można znaleźć w dokumentacji

Przykład:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

console.log(date); // 2015-09-13 03:39:27

var stillUtc = moment.utc(date).toDate();
var local = moment(stillUtc).local().format('YYYY-MM-DD HH:mm:ss');

console.log(local); // 2015-09-13 09:39:27

Próbny:

var date = moment.utc().format();
console.log(date, "- now in UTC"); 

var local = moment.utc(date).local().format();
console.log(local, "- UTC now to local"); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


16
nie zadziałał dla mnie, czas jest nadal 5 godzin przed czasem moich przeglądarek, co jest poprawne
brian Scroggins

jeśli momentjs zna lokalną strefę czasową, czy istnieje sposób na jej odzyskanie, czy też moment.tz.guess () jest do tego potrzebny?
jEremyB,

@jEremyB moment().format('Z')i moment().format('ZZ')możemy Ci pomóc. Spójrz też, (new Date()).getTimezoneOffset()może to dla Ciebie wystarczające
akson

@brianScroggins, pamiętaj, aby nie zapomnieć .utc(date). Po pierwsze, wiersz, w var local = ...którym go nie ma, może wprowadzać w błąd.
Jocelyn

62

Spróbuj tego:

let utcTime = "2017-02-02 08:00:13";

var local_date= moment.utc(utcTime ).local().format('YYYY-MM-DD HH:mm:ss');

3
Określenie strefy, w której został zapisany, zadziałało u mnie (ta odpowiedź). Okazało się również, że ułatwia to życie, jeśli zawsze zapisujesz rzeczy w utc, a następnie formatujesz po stronie klienta.
Juan Pablo Ugas

1
To zadziałało w moim przypadku, gdzie oszczędzamy czas w UTC w naszej bazie danych i wyświetlamy tylko czas lokalny na kliencie. Dzięki.
Alex Ehlert

18
let utcTime = "2017-02-02 08:00:13.567";
var offset = moment().utcOffset();
var localText = moment.utc(utcTime).utcOffset(offset).format("L LT");

Spróbuj tego JsFiddle


2
Działa to świetnie, ale dlaczego .local () nie zwraca tego samego wyniku?
Steve

to skrzypce zwraca następujący wynik na moim komputerze: 02.02.2017 08:00 (czas UTC) 02.02.2017 10:00 (czas lokalny) 02.02.2017 09:00 (czas lokalny w inny sposób )
Steve

3

Uwaga: zaktualizuj odpowiednio format daty.

Sformatuj datę

   __formatDate: function(myDate){
      var ts = moment.utc(myDate);
      return ts.local().format('D-MMM-Y');
   }

Formatuj czas

  __formatTime: function(myDate){
      var ts = moment.utc(myDate);
      return ts.local().format('HH:mm');
  },

3

Aby przekonwertować UTC na czas lokalny

let UTC = moment.utc()
let local = moment(UTC).local()

Lub chcesz bezpośrednio uzyskać czas lokalny

let local = moment()

var UTC = moment.utc()
console.log(UTC.format()); // UTC time

var cLocal = UTC.local()
console.log(cLocal.format()); // Convert UTC time

var local = moment();
console.log(local.format()); // Local time
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


0

Stworzyłem jedną funkcję, która konwertuje wszystkie strefy czasowe na czas lokalny.

Wymagania:

1. npm i moment-timezone

function utcToLocal(utcdateTime, tz) {
    var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
    var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
    var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
    var localDateTime
    var hours = zoneValue.split(":")[0]
    var minutes = zoneValue.split(":")[1]
    if (operator === "-") {
        localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else if (operator) {
        localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else {
        localDateTime = "Invalid Timezone Operator"
    }
    return localDateTime
}

utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")

//Returns "2019-11-14 12:45:37"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.