Misalkan pengguna situs web Anda memasuki rentang tanggal.
2009-1-1 to 2009-1-3
Anda perlu mengirim tanggal ini ke server untuk diproses, tetapi server mengharapkan semua tanggal dan waktu berada di UTC.
Sekarang anggaplah pengguna berada di Alaska atau Hawaii atau Fiji. Karena mereka berada di zona waktu yang sangat berbeda dari UTC, rentang tanggal perlu dikonversi menjadi sesuatu seperti ini:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Menggunakan objek Tanggal JavaScript, bagaimana Anda mengonversi rentang tanggal "terlokalisasi" pertama menjadi sesuatu yang akan dipahami server?
javascript
date
utc
dthrasher
sumber
sumber
Jawaban:
Sumber: dokumen web MDN
Format yang Anda butuhkan dibuat dengan
.toISOString()
metode ini. Untuk browser lama (ie8 dan di bawah), yang tidak mendukung metode ini, shim dapat ditemukan di sini :Ini akan memberi Anda kemampuan untuk melakukan apa yang Anda butuhkan:
Untuk kerja Timezone, time.js dan moment.js timezone adalah alat yang sangat berharga ... terutama untuk menavigasi zona waktu antara klien dan javascript server.
sumber
toISOString
apakah benar dikonversi ke UTC[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset
Juga dalam contoh mereka menunjukkan offset diperhitungkan ketika toISOString disebutSederhana dan bodoh
sumber
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
new Date(new Date().toUTCString().substr(0, 25))
now.toUTCSTring()
alih-alih (salah)now_utc.toString()
.Inilah metode saya:
utc
Objek yang dihasilkan sebenarnya bukan tanggal UTC, tetapi tanggal lokal bergeser untuk mencocokkan waktu UTC (lihat komentar). Namun, dalam praktiknya ia berhasil.sumber
Date.now()
memberi waktu lokal dan bukan waktu UTC, dan solusi ini tampaknya yang paling sederhana bagi saya. Setidaknya dalam kasus saya di mana saya ingin waktu UNIX dan bukan string yang diformat dengan baik. (satu-satunya perbedaan adalah bahwa saya akan berlipat ganda60 * 1000
hanya untuk menjadi lebih jelas :))now.toString()
denganutc.toString()
: tidak ada perubahan zona waktu, tetapi perubahan waktu, yang merupakan hal yang sangat berbeda. Namun, solusi yang lebih bersih akan menjadi jauh lebih rumit (saya kira begitu), dan kode ini berfungsi dengan baik di sebagian besar kasus, selama seseorang tidak berurusan lebih jauh dengan zona waktu. Itu membuat saya mengingatkan tentang bebek meninju : hal yang berbeda tetapi dibuat untuk berperilaku sama. Perhatikan juga kode DrunkCoder memiliki masalah yang sama.sumber
Konversikan ke ISO tanpa mengubah tanggal / waktu
Konversikan ke ISO dengan perubahan tanggal / waktu (tanggal / waktu akan berubah)
Tautan biola
sumber
Browser mungkin berbeda, dan Anda juga harus ingat untuk tidak mempercayai info apa pun yang dihasilkan oleh klien, karena dikatakan, pernyataan di bawah ini berfungsi untuk saya (Google Chrome v24 pada Mac OS X 10.8.2)
var utcDate = new Date(new Date().getTime());
sunting: "Apa bedanya dengan adil
new Date()
?" lihat di sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateMenambahkan 60000 * Date.getTimezoneOffset () seperti jawaban sebelumnya nyatakan tidak benar. Pertama, Anda harus menganggap semua Tanggal / Waktu sebagai UTC dengan pengubah zona waktu untuk tujuan tampilan.
Sekali lagi, browser mungkin berbeda, namun Date.getTime () mengembalikan jumlah milidetik sejak 1970-01-01 UTC / GMT. Jika Anda membuat Tanggal baru menggunakan nomor ini seperti yang saya lakukan di atas, itu akan menjadi UTC / GMT. Namun, jika Anda menampilkannya dengan memanggil .toString () itu akan muncul di zona waktu lokal Anda karena .toString () menggunakan zona waktu lokal Anda, bukan zona waktu objek Tanggal itu dipanggil.
Saya juga menemukan bahwa jika Anda memanggil .getTimezoneOffset () pada tanggal, itu akan mengembalikan zona waktu lokal Anda, bukan zona waktu objek tanggal yang Anda panggil (namun saya tidak dapat memverifikasi ini sebagai standar).
Di browser saya, menambahkan 60000 * Date.getTimezoneOffset () membuat DateTime yang bukan UTC . Namun ketika ditampilkan dalam browser saya (mis: .toString ()), ini menampilkan DateTime di zona waktu lokal saya yang akan menjadi waktu UTC yang benar jika info zona waktu diabaikan.
sumber
new Date()
, baik timestamp maupun zona waktu tidak berubahnew Date().getTime()
akan selalu mengembalikan stempel waktu yang agnostik ke zona waktu. Tidak ada stempel waktu yang dikaitkan dengannya hingga Anda mencoba memformatnya menjadi selain milidetik sejak zaman Unix.new Date(new Date().getTime())
pengembalian nilai persis sama dengannew Date()
. Bisakah Anda menjelaskan dalam arti apa jawaban Anda memberikan nilai berbedanew Date()
?new Date("5/19/2014").getTime()
. Konstruktor Tanggal membuat tanggal dengan offset +7. Di server (C #), saya menambahkan nilai yang diposting sebagai milidetik untuk unix zamannew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
. Hasilnya adalah5/19/2014 7:00:00 AM
. Jadi sepertinya getTime () memberikan jumlah milidetik termasuk offset UTC saya.new Date(new Date().getTime())
tidak berhasil. Saya dapat mengkonfirmasi bahwanew Date(Date.UTC(2019, 8, 27, 0, 0, 0))
memang menghasilkan waktu UTC. Jika Anda gagal menggunakanDate.UTC(...)
Anda akan mendapatkan tanggal dalam offset UTC di zona waktu Anda.sumber
Solusi lain untuk mengonversi ke UTC dan menjadikannya sebagai objek tanggal: (Ini berfungsi dengan menghapus bagian 'GMT' dari akhir string yang diformat, lalu memasukkannya kembali ke konstruktor Tanggal)
Saya perlu melakukan ini untuk berinteraksi dengan perpustakaan pemilih datetime. Tetapi secara umum itu ide yang buruk untuk bekerja dengan kencan dengan cara ini.
Pengguna umumnya ingin bekerja dengan waktu data dalam waktu lokal mereka, jadi Anda memperbarui kode sisi server untuk mengurai string datetime dengan offset dengan benar, lalu mengonversi ke UTC (opsi terbaik) atau Anda mengonversi ke sisi klien string UTC sebelum mengirim ke server (seperti dalam jawaban Will Stern)
sumber
Apakah Anda mencoba mengubah tanggal menjadi string seperti itu?
Saya akan membuat fungsi untuk melakukan itu, dan, meskipun sedikit kontroversial, tambahkan ke prototipe Date. Jika Anda tidak nyaman melakukan itu, maka Anda dapat menempatkannya sebagai fungsi mandiri, melewati tanggal sebagai parameter.
Jika Anda membutuhkannya dalam waktu UTC, ganti saja semua fungsi get * dengan getUTC *, mis: getUTCFullYear, getUTCMonth, getUTCHours ... lalu tambahkan "+00: 00" di akhir alih-alih offset zona waktu pengguna.
sumber
String(temp)
sejak cara lain ("" + temp
) dilaporkan sebagai kesalahan JSLint hari ini.toISOString
metodeseharusnya bekerja di sebagian besar browser yang lebih baru. kembali
2012-07-28T00:00:00.000Z
pada Firefox 6.0sumber
Rekomendasi saya ketika bekerja dengan tanggal adalah mengurai tanggal ke dalam masing-masing bidang dari input pengguna. Anda dapat menggunakannya sebagai string penuh, tetapi Anda bermain dengan api.
JavaScript dapat memperlakukan dua tanggal yang sama dalam format yang berbeda secara berbeda.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
Jangan pernah melakukan hal seperti:
Setelah tanggal Anda diuraikan ke dalam masing-masing bidang dari input pengguna, buat objek tanggal. Setelah objek tanggal dibuat, konversikan ke UTC dengan menambahkan offset zona waktu. Saya tidak bisa menekankan betapa pentingnya menggunakan offset dari objek tanggal karena DST (itu adalah diskusi lain namun untuk menunjukkan alasannya).
Sekarang Anda dapat mengirimkan tanggal ke server dalam waktu UTC. Sekali lagi saya akan sangat menyarankan agar tidak menggunakan string tanggal. Entah meneruskannya ke server dipecah menjadi granularity terendah yang Anda butuhkan misalnya tahun, bulan, hari, menit atau sebagai nilai seperti milidetik dari zaman unix.
sumber
Jika Anda sering berurusan dengan kencan, ada baiknya menggunakan moment.js ( http://momentjs.com ). Metode untuk mengkonversi ke UTC adalah:
Anda dapat menggunakan format untuk mengubah tanggal Anda ke format apa pun yang Anda inginkan:
Ada opsi offset pada saat itu juga tetapi ada perpustakaan pelengkap tambahan untuk berurusan dengan zona waktu ( http://momentjs.com/timezone/ ). Konversi waktu akan sesederhana ini:
sumber
moment(yourTime).utc()
danmoment.utc(yourTime)
? Saya biasanya menggunakan yang terakhir.Solusi saya menjaga tanggal tetap sama, apa pun zona waktu yang ditetapkan di sisi klien. Mungkin seseorang akan merasakan manfaatnya.
Kasus penggunaan saya:
Saya membuat aplikasi todo, tempat Anda mengatur tanggal tugas Anda. Tanggal ini harus tetap konstan, tidak peduli apa zona waktu Anda.
Contoh. Anda ingin menelepon teman Anda pada jam 8 pagi pada tanggal 25 Juni.
Anda membuat tugas ini 5 hari sebelum (20 Juni) saat Anda berada di Cina.
Kemudian, pada hari yang sama, Anda terbang ke New York selama beberapa hari.
Kemudian pada tanggal 25 Juni, ketika Anda masih di New York, Anda bangun jam 7:30 pagi (yang berarti Anda harus menerima notifikasi tugas dalam 30 menit (bahkan jam 1:30 siang sudah di China di mana Anda berada saat membuat tugas)
Jadi tugasnya mengabaikan zona waktu. Itu berarti 'Saya ingin melakukannya pada jam 8 pagi di zona waktu apa pun yang akan saya tempati'.
Yang saya lakukan adalah katakanlah 'Saya berasumsi Anda selalu berada di London Timezone - UTC'.
Artinya adalah - ketika pengguna memilih tanggal di Zona Waktu - saya mengonversi tanggal ini ke tanggal yang sama di UTC. yaitu. Anda memilih 8 pagi di Cina, tetapi saya mengubahnya menjadi 8 pagi dalam UTC.
Kemudian - lain kali Anda membuka aplikasi - Saya membaca tanggal yang disimpan dalam UTC dan mengubahnya ke tanggal yang sama di zona waktu Anda saat ini - mis. Saya mengonversi 8 pagi dalam UTC ke 8 pagi di zona waktu New York.
Solusi ini berarti bahwa tanggal tersebut dapat berarti sesuatu yang lain bergantung pada di mana Anda berada saat mengaturnya dan di mana Anda membacanya, tetapi itu tetap konstan dengan cara yang 'terasa' seperti Anda selalu berada di zona waktu yang sama.
Mari kita menulis beberapa kode:
Pertama - kami memiliki 2 fungsi utama untuk mengkonversi dari / ke UTC mengabaikan zona waktu:
Kemudian, saya menyimpan / membaca tanggal ini seperti:
sumber
Saya baru saja menemukan bahwa versi 1.2.3 dari date.format.js Steven Levithan melakukan apa yang saya inginkan. Ini memungkinkan Anda untuk menyediakan string format untuk tanggal JavaScript dan akan dikonversi dari waktu setempat ke UTC. Berikut kode yang saya gunakan sekarang:
sumber
Saya telah menemukan tanggal Plugin jQuery Globalization Plugin bekerja dengan baik. Metode lain memiliki masalah lintas-browser dan hal-hal seperti date.js belum diperbarui dalam waktu yang cukup lama.
Anda juga tidak memerlukan datePicker di halaman tersebut. Anda bisa memanggil sesuatu yang mirip dengan contoh yang diberikan dalam dokumen:
sumber
Fungsi ini bekerja dengan baik untuk saya.
sumber
Menggunakan metode UTC moment.js ;
sumber
Ini akan memberi Anda Tanggal dan Waktu UTC yang tepat.
Itu karena
getTimezoneOffset()
akan memberi Anda perbedaan zona waktu dalam beberapa menit. Saya sarankan Anda untuk tidak menggunakantoISOString()
karena output akan berada di string Karena itu di masa depan Anda tidak akan dapat memanipulasi tanggalsumber
Inilah yang telah saya lakukan di masa lalu:
sumber
Jika Anda membutuhkan Objek Tanggal
Hanya melewati string tanggal Tanggal mengasumsikan waktu 00:00 digeser berdasarkan zona waktu:
Jika Anda menambahkan jam dan menit saat ini Anda mendapatkan tanggal yang tepat:
sumber
Melihat pertanyaan Anda, jelas bahwa Anda hanya ingin mengirim rentang tanggal ke backend Anda untuk diproses lebih lanjut.
Saya berasumsi bahwa Anda mematuhi pedoman data standar yang mengharapkan data dalam format tertentu. Misalnya, saya menggunakan ODATA yang merupakan RESTfull API yang mengharapkan objek waktu tanggal dalam format: -
Itu dapat dengan mudah dicapai melalui cuplikan yang diposting di bawah ini (Silakan ubah format sesuai kebutuhan Anda).
var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";
Jika di sisi lain, Anda berada dalam situasi saya di mana Anda telah menerima tanggal dari backend Anda, dan browser mengubahnya menjadi tanggal lokal Anda. Anda sebaliknya tertarik pada tanggal UTC maka Anda dapat melakukan hal-hal berikut: -
var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);
Cuplikan kode di atas pada dasarnya menambah / mengurangi waktu yang ditambahkan / dikurangi oleh browser berdasarkan zona waktu.
Sebagai contoh jika saya dalam EST (GMT-5) dan Layanan saya mengembalikan objek waktu tanggal = Rabu 17 Agustus 2016 00:00:00 GMT-0500 browser saya secara otomatis mengurangi offset zona waktu (5 jam) untuk mendapatkan waktu lokal saya. Jadi jika saya mencoba untuk mengambil waktu saya dapatkan Rabu 16 Agustus 2016 19:00:00 GMT-0500. Ini menyebabkan banyak masalah. Ada banyak perpustakaan di luar sana yang pasti akan membuat ini lebih mudah tetapi saya ingin berbagi pendekatan JS murni.
Untuk info lebih lanjut silakan lihat di: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ di mana saya dapat inspirasi.
Semoga ini membantu!
sumber
Metode ini akan memberi Anda:
2017-08-04T11:15:00.000+04:30
dan Anda dapat mengabaikan variabel zona untuk mendapatkan2017-08-04T11:15:00.000
.sumber
Menggunakan paket momen, Anda dapat dengan mudah mengkonversi string tanggal UTC ke objek Tanggal baru:
Ini secara khusus membantu ketika server Anda tidak mendukung zona waktu dan Anda ingin menyimpan tanggal UTC selalu di server dan mendapatkannya kembali sebagai objek Date yang baru. Kode di atas berfungsi untuk kebutuhan saya terhadap masalah yang serupa dengan utas ini. Berbagi di sini sehingga dapat membantu orang lain. Saya tidak melihat solusi tepat di atas dalam jawaban apa pun. Terima kasih.
sumber
const event = Tanggal baru ();
console.log (event.toUTCString ());
sumber
Saya tahu pertanyaan ini sudah lama, tetapi sedang melihat masalah yang sama, dan salah satu opsi adalah mengirim date.valueOf () ke server sebagai gantinya. fungsi valueOf () dari Tanggal javascript mengirimkan jumlah milidetik sejak tengah malam 1 Januari 1970 UTC.
Nilai dari()
sumber
Jadi ini adalah cara saya harus melakukannya karena saya masih ingin objek tanggal JavaScript untuk memanipulasi sebagai tanggal dan sayangnya banyak dari jawaban ini mengharuskan Anda untuk pergi ke string.
sumber
benang tambahkan momen
sumber
Lebih sederhana
sumber
setTime
mengandalkannew Date
, yang tidak termasuk. Mohon selesaikan jawabannya.