Di aplikasi Java Script saya, tanggal saya disimpan dalam format seperti ini:
2011-09-24
Sekarang ketika saya mencoba menggunakan nilai di atas untuk membuat objek Date baru (jadi saya dapat mengambil tanggal dalam format yang berbeda), tanggal selalu kembali satu hari libur. Lihat di bawah:
var doo = new Date("2011-09-24");
console.log(doo);
log:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
javascript
date
pungutan
sumber
sumber
Jawaban:
Perhatikan bahwa Eastern Daylight Time adalah
-4 hours
dan jam pada tanggal Anda kembali adalah20
.yaitu tengah malam 2011-09-24. Tanggal diuraikan dalam UTC (GMT) karena Anda memberikan string hanya tanggal tanpa indikator zona waktu. Jika Anda memberikan string tanggal / waktu sebagai gantinya indikator (
new Date("2011-09-24T00:00:00")
), itu akan diuraikan dalam zona waktu lokal Anda. (Secara historis ada inkonsistensi di sana, paling tidak karena spek berubah lebih dari sekali, tetapi peramban modern harusnya oke; atau Anda selalu dapat menyertakan indikator zona waktu.)Anda mendapatkan tanggal yang tepat, Anda tidak pernah menentukan zona waktu yang benar.
Jika Anda perlu mengakses nilai tanggal, Anda dapat menggunakan
getUTCDate()
atau salah satu darigetUTC*()
fungsi lainnya :sumber
EDT
adalah waktu musim panas (juga dikenal sebagai musim panas) ,EST
adalah zona waktu yang berlaku pada bulan Januari.new Date('2012-01-01 GMT')
masih berlaku offset karena mengkonversikannya ke waktu tanggal lokal pengguna.get*
metode dan memerlukannya untuk mengembalikan tanggal / waktu yang benar termasuk offset zona waktu yang tidak diketahui, cukup tambahkan offset zona waktu yang tidak dikenal:d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
Ini akan menormalkan tanggal ke lokal pengguna sehingga.get*
metode kembali nilai yang diharapkan..getUTC*
Metode - metode itu akan salah, jadi berhati-hatilah.Ada beberapa hal gila yang terjadi dengan objek JS DATE yang mengonversi string, misalnya pertimbangkan tanggal berikut yang Anda berikan
Jika Anda memberikan argumen terpisah ke konstruktor Tanggal Anda bisa mendapatkan hasil berguna lainnya seperti yang dijelaskan di bawah ini
Catatan: argumen bisa bertipe Number atau String. Saya akan menunjukkan contoh dengan nilai campuran.
sumber
Untuk menormalkan tanggal dan menghilangkan offset yang tidak diinginkan (diuji di sini: https://jsfiddle.net/7xp1xL5m/ ):
Ini juga mencapai hal yang sama dan memberikan kredit kepada @tpartee (diuji di sini: https://jsfiddle.net/7xp1xL5m/1/ ):
sumber
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Jika Anda ingin mendapatkan jam 0 dari beberapa tanggal di zona waktu lokal, berikan masing-masing bagian tanggal ke
Date
konstruktor.sumber
Hanya ingin menambahkan yang tampaknya menambahkan spasi di akhir string akan menggunakan UTC untuk pembuatan.
Sunting: Ini bukan solusi yang disarankan, hanya jawaban alternatif. Tolong jangan gunakan pendekatan ini karena sangat tidak jelas apa yang terjadi. Ada beberapa cara seseorang bisa memperbaiki ini secara tidak sengaja menyebabkan bug.
sumber
Saya percaya itu ada hubungannya dengan penyesuaian zona waktu. Tanggal yang Anda buat adalah dalam GMT dan waktu default adalah tengah malam, tetapi zona waktu Anda adalah EDT, sehingga mengurangi 4 jam. Coba ini untuk memverifikasi:
sumber
Masalah Anda secara khusus dengan zona waktu. Catatan bagian
GMT-0400
- yaitu Anda berada 4 jam di belakang GMT. Jika Anda menambahkan 4 jam ke tanggal / waktu yang ditampilkan, Anda akan mendapatkan tepat tengah malam 2011/09/24. GunakantoUTCString()
metode sebagai gantinya untuk mendapatkan string GMT:sumber
Ini mungkin bukan jawaban yang baik, tetapi saya hanya ingin berbagi pengalaman saya dengan masalah ini.
Aplikasi saya secara global menggunakan tanggal utc dengan format 'YYYY-MM-DD', sedangkan plugin datepicker yang saya gunakan hanya menerima tanggal js, sulit bagi saya untuk mempertimbangkan utc dan js. Jadi ketika saya ingin memberikan tanggal yang diformat 'YYYY-MM-DD' ke datepicker saya, saya pertama-tama mengonversinya ke format 'MM / DD / YYYY' menggunakan moment.js atau apa pun yang Anda suka, dan tanggal yang ditampilkan pada datepicker sekarang benar. Sebagai contoh Anda
Rupanya d1 adalah apa yang saya inginkan. Semoga ini bisa bermanfaat bagi sebagian orang.
sumber
Ini melalui saya untuk satu lingkaran, memberi +1 pada jawaban zzzBov. Ini adalah konversi penuh tanggal yang berfungsi untuk saya menggunakan metode UTC:
sumber
Artinya
2011-09-24 00:00:00 GMT
, dan karena Anda berada diGMT -4
, itu akan menjadi20:00
hari sebelumnya.Secara pribadi, saya mengerti
2011-09-24 02:00:00
, karena saya tinggal diGMT +2
.sumber
Meskipun dalam kasus OP zona waktu adalah EDT, tidak ada jaminan pengguna yang mengeksekusi skrip Anda akan berada di zona waktu EDT, jadi hardcoding offset tidak akan selalu berfungsi. Solusi yang saya temukan membagi string tanggal dan menggunakan nilai-nilai terpisah di konstruktor Tanggal.
Perhatikan bahwa Anda harus memperhitungkan sepotong keanehan JS: bulannya berbasis nol.
sumber
Saya mengalami masalah yang pasti ini ketika klien saya menggunakan Waktu Standar Atlantik. Nilai tanggal yang diambil klien adalah "2018-11-23" dan ketika kode meneruskannya ke
new Date("2018-11-23")
output untuk klien adalah untuk hari sebelumnya. Saya membuat fungsi utilitas seperti yang ditunjukkan pada cuplikan yang menormalkan tanggal, memberi klien tanggal yang diharapkan.date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
sumber
jika Anda hanya ingin memastikan masing-masing bagian tanggal tetap sama untuk tujuan tampilan, * ini tampaknya berfungsi, bahkan ketika saya mengubah zona waktu saya:
tambahkan saja angka nol di sana.
Dalam kode saya, saya melakukan ini:
Dan saya beralih di zona waktu saya di komputer saya dan tanggal tetap sama dengan string tanggal yyyy-mm-dd yang saya dapatkan dari API.
Tetapi apakah saya melewatkan sesuatu? Apakah ini ide yang buruk?
* setidaknya dalam chrome. Ini Tidak berfungsi di Safari! pada tulisan ini
sumber
.toISOString()
, itu kembali 1 hari.new Date('2019/11/18 05:30:00').toISOString();
bekerja untuk sayaCara terbaik untuk menangani ini tanpa menggunakan lebih banyak metode konversi,
Sekarang tambahkan saja GMT di tanggal Anda atau Anda dapat menambahkannya.
Langsung: https://jsfiddle.net/gajender/2kop9vrk/1/
sumber
Saya menghadapi beberapa masalah seperti ini. Tapi masalah saya adalah set off saat mendapatkan tanggal dari database.
ini dimasukkan ke dalam basis data dan dalam format UTC.
Jadi ketika saya dapatkan dari database dan periksa tanggal itu menambahkan offset dengan itu dan mengirim kembali ke javascript.
Ini menambah +05: 00 karena ini adalah zona waktu server saya. Klien saya ada di zona waktu yang berbeda +07: 00.
Jadi di sini adalah solusi saya apa yang saya lakukan dengan masalah ini.
Jadi ketika tanggal berasal dari server dan memiliki server offset maka saya membagi tanggal dan menghapus server offset dan kemudian mengonversi ke tanggal. Ini menyelesaikan masalah saya.
sumber
jika Anda memerlukan solusi sederhana untuk ini lihat:
sumber
Anda menggunakan format string tanggal ISO yang, menurut halaman ini , menyebabkan tanggal dibangun menggunakan zona waktu UTC:
Jika Anda memformat teks secara berbeda, seperti
"Jan 01 1970"
, maka (setidaknya pada mesin saya) itu menggunakan zona waktu lokal Anda.sumber
Mencoba menambahkan 2 sen saya ke utas ini (menguraikan jawaban @ paul-wintz).
Sepertinya saya bahwa ketika konstruktor Tanggal menerima string yang cocok dengan bagian pertama dari format ISO 8601 (bagian tanggal), ia melakukan konversi tanggal yang tepat di zona waktu UTC dengan 0 waktu. Ketika tanggal itu dikonversi ke waktu lokal, pergeseran tanggal dapat terjadi jika tengah malam UTC adalah tanggal yang lebih awal di zona waktu setempat.
Jika string tanggal dalam format "longgar" lainnya (menggunakan "/" atau tanggal / bulan tidak diisi dengan nol) itu membuat tanggal dalam zona waktu lokal, sehingga tidak ada masalah pergeseran tanggal.
Jadi satu perbaikan cepat, seperti yang disebutkan di atas, adalah mengganti "-" dengan "/" di string Date-diformat ISO Anda.
sumber
Menyimpan
yyyy-mm-dd
dalam format MySql Date Anda harus melakukan hal berikut:sumber
Log Anda menghasilkan GMT sehingga Anda ingin menentukan zona waktu Anda:
sumber
Nevermind, tidak melihat GMT -0400, yang menyebabkan tanggalnya kemarin
Anda dapat mencoba mengatur "waktu" default menjadi 12:00:00
sumber
Berikut ini bekerja untuk saya -
sumber