Momen Js UTC ke Waktu Lokal

158

Saya mencoba mengonversi waktu UTC ke waktu lokal. Saya telah mengikuti contoh ini dari tautan ini: http://jsfiddle.net/FLhpq/4/light/ . Sepertinya saya tidak bisa mendapatkan hasil lokal yang tepat. Misalnya, jika 10:30 di sini, daripada 10:30 sakit dapatkan 15:30. Ini kode saya:

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);

Apapun yang saya lakukan, waktu selalu keluar pada waktu UTC. Saya tinggal di Houston jadi saya tahu zona waktu adalah masalahnya. Saya telah mengikuti kode di tautan tetapi sepertinya bisa mengetahui waktu setempat. Apa yang saya lakukan salah?

brian Scroggins
sumber

Jawaban:

258

Untuk mengubah waktu UTC ke Lokal, Anda harus menggunakan moment.local().

Untuk info lebih lanjut, lihat dokumen

Contoh:

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

Demo:

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>

akson
sumber
17
tidak berhasil untuk saya, waktu masih 5 jam lebih awal dari waktu browser saya yang benar
Brian Scroggins
jika momentjs mengetahui zona waktu lokal, apakah ada cara untuk mengambilnya atau moment.tz.guess () diperlukan untuk melakukan ini?
jEremyB
@jEremyB, moment().format('Z')dan moment().format('ZZ')dapat membantu Anda. Juga, lihat (new Date()).getTimezoneOffset()mungkin itu cukup untuk kasus Anda
akson
@brianScroggins, jangan lupa .utc(date). Pada bagian pertama, baris yang var local = ...tidak memilikinya bisa menyesatkan.
Jocelyn
72

Coba ini:

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

var local_date= moment.utc(utcTime ).local().format('YYYY-MM-DD HH:mm:ss');
JAMZAD
sumber
3
Menentukan zona penyimpanannya berhasil untuk saya (jawaban ini). Juga, menemukan itu membuat hidup lebih mudah jika Anda selalu menyimpan sesuatu dalam utc kemudian memformatnya di sisi klien.
Juan Pablo Ugas
3
Ini berfungsi dalam kasus saya di mana kami menghemat waktu dalam UTC di db kami dan hanya menampilkan waktu lokal di klien. Terima kasih.
Alex Ehlert
19
let utcTime = "2017-02-02 08:00:13.567";
var offset = moment().utcOffset();
var localText = moment.utc(utcTime).utcOffset(offset).format("L LT");

Coba JsFiddle ini

Abdur Rahim
sumber
2
Ini berfungsi dengan baik tetapi mengapa .local () tidak mengembalikan hasil yang sama?
Steve
biola ini mengembalikan hasil berikut di komputer saya: 02/02/2017 8:00 AM (Waktu UTC) 02/02/2017 10:00 AM (Waktu Lokal) 02/02/2017 9:00 AM (Waktu Lokal dengan cara lain )
Steve
8

Untuk mengubah UTC ke waktu lokal

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

Atau Anda ingin langsung mendapatkan waktu setempat

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>

Brady Huang
sumber
3

Catatan: harap perbarui format tanggal yang sesuai.

Format Tanggal

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

Format Waktu

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

Saya telah membuat satu fungsi yang mengubah semua zona waktu menjadi waktu lokal.

Persyaratan:

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"
Rohit Parte
sumber
0

Inilah yang berhasil bagi saya, ini membutuhkan momen-tz dan juga momen.

const guess = moment.utc(date).tz(moment.tz.guess());
const correctTimezone = guess.format()

Sokushinbutsu
sumber