Ubah UTC Epoch ke tanggal lokal

275

Saya telah berjuang dengan ini sebentar. Saya mencoba mengubah zaman ke objek tanggal. Zaman dikirim kepada saya dalam UTC. Setiap kali Anda melewati new Date()zaman, itu menganggap itu zaman lokal. Saya mencoba membuat objek UTC, kemudian menggunakan setTime()untuk menyesuaikannya dengan zaman yang tepat, tetapi satu-satunya metode yang tampaknya berguna toUTCString()dan string tidak membantu saya. Jika saya meneruskan string itu ke tanggal yang baru, ia harus memperhatikan bahwa itu UTC, tetapi tidak.

new Date( new Date().toUTCString() ).toLocaleString()

Upaya saya berikutnya adalah mencoba untuk mendapatkan perbedaan antara zaman lokal saat ini dan zaman sekarang UTC, tetapi saya juga tidak bisa mendapatkannya.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

Itu hanya memberi saya perbedaan yang sangat kecil, di bawah 1000, yang dalam milidetik.

Ada saran?

Shane Reustle
sumber
11
Waktu zaman didefinisikan sebagai milidetik yang telah berlalu sejak tanggal 1970 di UTC . Tidak ada yang namanya zaman lokal! Tidak yakin saya mengerti masalah Anda.
Chetan S
Mungkin zona waktu di komputer salah, mengarah ke nilai UTC yang berbeda?
kijin
2
Anda harus mengatur jam Anda ke waktu UTC, jika Anda ingin 'melihat' waktu UTC ketika Anda menggunakan toLocaleString (). UTC tengah malam adalah 19:00 EST. Jika Anda menggunakan Date (). ToString () baru alih-alih localeString, Anda akan mendapatkan sesuatu seperti: 'Fri Jan 07 2011 07:00:00 GMT-0500', yang termasuk offset.
kennebec

Jawaban:

467

Saya pikir saya punya solusi yang lebih sederhana - atur tanggal awal ke zaman dan tambahkan unit UTC. Katakanlah Anda memiliki zaman UTC disimpan dalam hitungan detik. Bagaimana 1234567890. Untuk mengonversi itu ke tanggal yang tepat di zona waktu lokal:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d sekarang tanggal (di zona waktu saya) diatur ke Fri Feb 13 2009 18:31:30 GMT-0500 (EST)

pengguna1030503
sumber
190
FWIW, objek Date dapat diinisialisasi dengan milidetik. Jadi, var d = new Date(utcSeconds * 1000)harus menghasilkan hasil yang sama.
kurttheviking
54
var d = new Date(1234567890000)mengembalikan hasil yang sama
Matjaz Lipus
11
berpikir mungkin orang lain bisa mendapatkan kejelasan dari beberapa poin: objek tanggal tidak diatur dengan zona waktu "dicap di dalamnya". anggap saja sebagai angka. angka itu adalah jumlah milidetik sejak 1970 1 Januari UTC, hingga sekarang (sekarang berada di UTC juga). Jadi, setiap kali Anda membuat objek tanggal, itu benar-benar dalam UTC di belakang layar. 2. Untuk menampilkan tanggal itu, Anda dapat menampilkannya sebagai pengaturan lokal (toLocaleString (), atau, dalam UTC (toUTCString ()). Anda tidak perlu mengonversi apa pun sendiri. Bangun dengan utc millisec, semuanya bagus. Bangun dengan string - asalkan ada di zona waktu setempat
da Bich
2
1234567890000 diperlakukan sama dengan 1234567890, alias masalah Y39K ...
muttonUp
1
@muttonUp, dengan 1000 mulitplication berhasil. Tapi, 'Masalah Y39K "google tidak memberikan hasil yang valid. URL apa pun akan membantu
P Satish Patro
239

Sangat mudah, new Date()hanya membutuhkan milidetik, mis

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)
Djechlin
sumber
6
Yang bagus! Ini harus dianggap sebagai jawaban yang diterima benar-benar.
Nizar B.
Yang ini tidak bekerja untuk saya, itu berfungsi ketika Anda memiliki timestamp tetapi dengan utc epoch Anda harus menetapkan utcseconds secara manual, jawaban terima adalah jawaban yang tepat
sameerali
12
Ini jawaban yang tepat. Tanggal baru dapat mengambil milidetik, karena itu hanya kalikan dengan 1000: const d = new Date(epoch * 1000).
vinyll
@sameerali Mungkin Anda memiliki masalah berbeda dengan sistem Anda atau Anda bingung. Jawaban ini adalah jawaban yang benar. Definisi zaman Unix: jumlah detik yang berlalu sejak 1 Januari tengah malam UTC . Cukup kalikan dengan 1000 untuk mendapatkan jumlah milidetik yang berlalu.
nalply
32

Dan hanya untuk log, saya melakukan ini menggunakan perpustakaan Moment.js , yang saya gunakan untuk memformat pula.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)
Gus
sumber
1
Momen memang bagus, tetapi gila menggunakan perpustakaan 1.3MB untuk hanya mengonversi satu zaman ke tanggal. Tidak heran ada begitu banyak aplikasi simpul bengkak di luar sana.
not2qubit
20

Waktu zaman dalam detik dari 1 Januari 1970. date.getTime()mengembalikan milidetik dari 1 Januari 1970, jadi .. jika Anda memiliki cap waktu zaman, ubah menjadi cap waktu javascript dengan mengalikan dengan 1000.

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }
logic8
sumber
Bertanya-tanya apa yang sedang terjadi. Sangat bagus untuk mengetahui bahwa epochTime! == javascriptTime ketika sampai pada penguraian tanggal. Terima kasih!
GrayedFox
16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}
chris
sumber
1
Anda membuat hari saya. TY. Saya baru saja mengganti tanda minus dengan tanda plus untuk pekerjaan saya.
Ludovic Kuty
5

Untuk mengonversi waktu saat ini dalam [ms] ke waktu 24 jam. Anda mungkin perlu menentukan opsi untuk menonaktifkan format 12 jam .

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

atau sebagai JS:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

Catatan: Penggunaan di en-GBsini, hanyalah pilihan tempat (acak) menggunakan format 24 jam, itu bukan zona waktu Anda!

not2qubit
sumber
1
Ini adalah cara terbaik untuk mendapatkan segala jenis konversi dari metode Tanggal. Terima kasih!
SeaWarrior404
Satu-satunya hal yang saya tidak suka dengan hal di atas, adalah bahwa ia mengembalikan tanggal dalam format yang ambigu d/m/yyyyatau bukan m/d/yyyy? Hak (paling logis) cara untuk menampilkan ini harus: yyyy-mm-dd. Ada yang mengambil?
not2qubit
4

Waktu Epoch (yaitu Waktu Unix Epoch) hampir selalu jumlah detik yang telah berakhir sejak 1 Januari 1970 00:00:00 (waktu UTC), bukan jumlah milidetik yang disiratkan oleh beberapa jawaban di sini.

https://en.wikipedia.org/wiki/Unix_time

Karena itu, jika Anda telah diberi nilai waktu Unix Epoch mungkin akan dalam hitungan detik, dan akan terlihat seperti 1547035195. Jika Anda ingin menjadikan manusia ini dapat dibaca dalam JavaScript, Anda perlu mengonversi nilainya menjadi milidetik, dan meneruskan nilainya ke Date(value)konstruktor, misalnya:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

Anda tidak perlu melakukan d.setUTCMilliseconds(0)langkah dalam jawaban yang diterima karena Date(value)konstruktor JavaScript mengambil UTC nilai dalam milidetik (bukan waktu setempat).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

Juga perhatikan bahwa Anda harus menghindari menggunakan Date(...)konstruktor yang mengambil representasi string datetime, ini tidak dianjurkan (lihat tautan di atas).

garryp
sumber
3

Apakah Anda hanya meminta untuk mengubah string UTC ke string "lokal"? Anda bisa melakukannya:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);
ZagNut
sumber
3

Penambahan jawaban di atas oleh @djechlin

d = '1394104654000';
new Date(parseInt(d));

mengkonversi waktu EPOCH ke tanggal yang dapat dibaca manusia. Hanya saja, jangan lupa bahwa jenis waktu EPOCH harus berupa Integer.

Sarvar Nishonboev
sumber
3

Solusi paling sederhana yang saya temukan untuk ini, adalah:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

Perhatikan ini tidak memiliki * 1000pada akhir new Date(timestamp)pernyataan karena ini (bagi saya toh!) Selalu sepertinya memberikan tanggal yang salah, yaitu bukannya memberikan tahun 2019 itu memberikan tahun sebagai 51015, jadi ingatlah itu.

Rob P
sumber
2

Jika Anda lebih suka menyelesaikan cap waktu dan tanggal konversi dari dan ke UTC dan waktu setempat tanpa pustaka seperti moment.js, lihat opsi di bawah ini.

Untuk aplikasi yang menggunakan cap waktu UTC, Anda mungkin perlu menunjukkan tanggal di browser dengan mempertimbangkan zona waktu lokal dan penghematan siang hari jika berlaku. Mengedit tanggal yang ada di waktu penghematan siang hari yang berbeda walaupun di zona waktu yang sama bisa rumit.

The NumberdanDate ekstensi bawah memungkinkan Anda untuk menampilkan dan mendapatkan tanggal di zona waktu cap waktu. Misalnya, katakanlah Anda berada di Vancouver, jika Anda mengedit tanggal di bulan Juli atau di bulan Desember, itu bisa berarti Anda mengedit tanggal di PST atau PDT.

Saya sarankan Anda untuk memeriksa Cuplikan Kode di bawah untuk menguji solusi ini.

Konversi dari milidetik

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

Konversi dari tanggal

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

Pemakaian

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

Lihat sendiri

Darlesson
sumber
Ini jawaban yang sebenarnya. Bekerja seperti pesona bagi saya. Menyetel Date baru (0) dan menambahkan miliSeconds sama dengan Date baru (miliSeconds)
Jersey_Guy
1

EDIT

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

EDIT diperbaiki

Amjad Masad
sumber
Saya mengalami hal ini dalam contoh kedua saya. Perbedaan yang saya berikan ada di mana saja antara 50 dan 900, yang dalam milidetik (menunjukkan waktu selama memproses perhitungan, bukan perbedaan yang sebenarnya)
Shane Reustle
Tidak ada yang membantu saya. Mereka kehilangan metode setUTCTime, yang akan menjadi sempurna: P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle
Tidak berfungsi, setidaknya di Firefox untuk Ubuntu. Kode tidak boleh ditetapkan hari / bulan / tahun setelah tanggal yang ditentukan.
Simon Kozlov
@Simon Kozlov Sebenarnya itu anggapan yang salah dalam objek tanggal, setDate dan getDate merujuk pada hari di bulan, dan masalahnya adalah saya menggunakan fungsi seperti (setUTCDay) yang tidak ada, terkejut diterima!
Amjad Masad
@AmjadMasad Jawaban Anda akan lebih membantu jika Anda juga menampilkan output yang diharapkan.
not2qubit
0

Mengingat, Anda telah epoch_timetersedia,

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format
apurva.nandan
sumber
0

@Amjad, ide bagus, tetapi implementasi yang lebih baik adalah:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}
Walf
sumber
-1

Pertama-tama ubah ke String dan kemudian ganti teks zona waktu.

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
Robot Boy
sumber