Saat menulis aplikasi web, masuk akal untuk menyimpan (sisi server) semua data di DB sebagai cap waktu UTC.
Saya heran ketika saya perhatikan bahwa Anda tidak bisa melakukan banyak hal dalam hal manipulasi zona waktu di JavaScript.
Saya sedikit memperpanjang objek Date. Apakah fungsi ini masuk akal? Pada dasarnya, setiap kali saya mengirim sesuatu ke server, itu akan menjadi timestamp yang diformat dengan fungsi ini ...
Bisakah Anda melihat masalah besar di sini? Atau mungkin solusi dari sudut yang berbeda?
Date.prototype.getUTCTime = function(){
return new Date(
this.getUTCFullYear(),
this.getUTCMonth(),
this.getUTCDate(),
this.getUTCHours(),
this.getUTCMinutes(),
this.getUTCSeconds()
).getTime();
}
Sepertinya sedikit berbelit-belit bagi saya. Dan saya juga tidak begitu yakin dengan kinerja.
javascript
timezone
utc
Merc
sumber
sumber
new Date().toString()
akan menunjukkan waktu saat ini zona waktu representasi,new Date().toUTCString()
akan menunjukkan waktu UTC cetak ulang, tapinew Date().getTime()
ini selalu UTC , karena itulah yang saat Unix didefinisikan sebagai: "waktu Unix (juga dikenal sebagai waktu POSIX atau waktu zaman) adalah sistem untuk menggambarkan instants dalam waktu, didefinisikan sebagai jumlah detik yang telah berlalu sejak 00:00:00 Waktu Universal Terkoordinasi (UTC), Kamis, 1 Januari 1970, tidak termasuk detik kabisat. "Jawaban:
Tanggal dibangun dengan cara itu menggunakan zona waktu lokal, membuat tanggal yang dibangun salah. Untuk mengatur zona waktu objek tanggal tertentu adalah dengan membangunnya dari string tanggal yang menyertakan zona waktu. (Saya punya masalah untuk membuatnya berfungsi di browser Android yang lebih lama.)
Perhatikan bahwa
getTime()
pengembalian milidetik, bukan detik biasa.Untuk cap waktu UTC / Unix, berikut ini sudah cukup:
Ini akan memasukkan faktor zona waktu saat ini ke dalam hasil. Untuk representasi string, jawaban David Ellis bekerja.
Untuk memperjelas:
Masukan itu diperlakukan sebagai waktu setempat . Jika waktu UTC dilewatkan, hasilnya akan berbeda. Amati (saya dalam GMT +02: 00 sekarang, dan ini 07:50):
Perhatikan juga bahwa
getUTCDate()
tidak dapat digantigetUTCDay()
. Ini karenagetUTCDate()
mengembalikan hari dalam sebulan ; sedangkan,getUTCDay()
mengembalikan hari dalam seminggu .sumber
new Date()
, yang menciptakan tanggal baru dari input UTC Anda tetapi memperlakukannya sebagai tanggal / waktu setempat. 2) Ya, Anda harus menggunakanMath.floor(this.getTime() / 1000)
dalam hal ini.Anda juga bisa melakukannya dengan menggunakan getTimezoneOffset dan getTime,
sumber
var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000
. Tampaknyatt.getTime() - tt.getTimezoneOffset()
benar untukGMT+0800
.var UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
new Date()
yang mencakup zona waktu .. yang agak mengalahkan tujuan mencoba melakukannya dalam js ..Cara termudah untuk mendapatkan waktu UTC dalam format konvensional adalah sebagai berikut:
sumber
Saya benar-benar berpikir nilai Date dalam js jauh lebih baik daripada mengatakan objek C # DateTime. Objek C # DateTime memiliki properti Jenis, tetapi tidak ada zona waktu mendasar yang ketat seperti itu, dan konversi zona waktu sulit dilacak jika Anda mengonversi antara dua waktu non UTC dan non lokal. Di js, semua nilai Tanggal memiliki nilai UTC dasar yang diedarkan dan diketahui terlepas dari konversi zona waktu atau yang Anda lakukan. Keluhan terbesar saya tentang objek Date adalah jumlah perilaku tidak terdefinisi yang telah dipilih oleh pelaksana browser, yang dapat membingungkan orang yang menyerang tanggal di js dengan trial and error daripada membaca spec. Menggunakan sesuatu seperti iso8601.js memecahkan perilaku yang bervariasi ini dengan mendefinisikan satu implementasi objek Date.
Secara default, spesifikasi mengatakan Anda dapat membuat tanggal dengan format tanggal ISO 8601 yang diperpanjang seperti
Jadi Anda dapat menyimpulkan waktu UTC yang tepat dengan cara ini.
Ketika Anda ingin meneruskan nilai Tanggal kembali ke server yang akan Anda hubungi
atau jika Anda lebih suka bekerja dengan cap waktu milidetik (jumlah milidetik dari 1 Januari 1970 UTC)
ISO 8601 adalah standar. Anda tidak dapat bingung tentang apa arti string tanggal jika Anda menyertakan offset tanggal. Apa artinya ini bagi Anda sebagai pengembang adalah Anda tidak perlu berurusan dengan konversi waktu setempat sendiri . Nilai waktu lokal ada murni untuk kepentingan pengguna, dan nilai tanggal secara default ditampilkan di waktu lokal mereka. Semua manipulasi waktu lokal memungkinkan Anda untuk menampilkan sesuatu yang masuk akal bagi pengguna dan untuk mengubah string dari input pengguna. Ini praktik yang baik untuk mengonversi ke UTC sesegera mungkin, dan objek js Date menjadikan ini cukup sepele.
Pada sisi negatifnya tidak ada banyak ruang untuk memaksa zona waktu atau lokal untuk klien (yang saya tahu), yang dapat mengganggu pengaturan spesifik situs web, tapi saya kira alasan di balik ini adalah bahwa itu adalah pengguna konfigurasi yang tidak boleh disentuh.
Jadi, singkatnya, alasan tidak ada banyak dukungan asli untuk manipulasi zona waktu adalah karena Anda tidak ingin melakukannya.
sumber
Anda biasanya tidak perlu melakukan banyak "manipulasi zona waktu" di sisi klien. Sebagai aturan saya mencoba untuk menyimpan dan bekerja dengan tanggal UTC, dalam bentuk
ticks
atau " jumlah milidetik sejak tengah malam 1 Januari 1970. " Ini benar-benar menyederhanakan penyimpanan, penyortiran, perhitungan offset, dan yang paling penting, membuat Anda sakit kepala dari penyesuaian "Waktu Penghematan Siang Hari". Inilah sedikit kode JavaScript yang saya gunakan.Untuk mendapatkan waktu UTC saat ini:
Maka yang biasanya Anda perlukan adalah memformat tanggal / waktu untuk pengguna akhir untuk zona waktu dan format lokal mereka . Yang berikut menangani semua kerumitan format tanggal dan waktu pada komputer klien:
Jadi contoh berikut:
Mengembalikan yang berikut (untuk lokal Bahasa Inggris AS saya):
sumber
getTimezoneOffset
nilai dalamgetCurrentTimeUTC
fungsi Anda, Anda sebenarnya mengembalikan waktu yang berbeda. HasilgetTime
ini sudah di UTC.tmLoc.getTime()
adalah offset terhadap waktu setempat. Itu mudah untuk memeriksa apakah Anda memiliki akses ke apa pun yang menjalankan JavaScript.getTime
, yang menunjukkan Anda pada "nilai waktu" yang ditentukan dalam §15.9.5 , yang merupakanPrimitiveValue
, sebagaimana diatur dalam §15.9.3.3 secara eksplisit sebagai UTC.tmLoc
vianew Date()
, maka itu hal yang sama. Zona waktu akan memengaruhi output stringtmLoc.toString()
dan item serupa, tetapi tidak akan memengaruhi.tmLoc.getTime()
Itu selalu hanya beberapa milidetik sejak tengah malam 1970-01-01 di UTC.//The offset is in minutes -- convert it to ms
Saya pikir ini adalah solusi yang lebih baik
sumber
Jika Anda menginginkan satu liner , Timestamp UTC Unix dapat dibuat dalam JavaScript sebagai:
Ini akan memperhitungkan zona waktu sistem. Pada dasarnya waktu berlalu dalam Detik sejak zaman.
Bagaimana itu bekerja:
new Date()
.unary +
sebelum pembuatan objek untuk mengubahnyatimestamp integer
. :+new Date()
.+new Date() / 1000
~~(+new Date())
sumber
tilde
, bukantilda
(sic). Sayangnya itu tidak akan membiarkan saya menghapus kesalahan ketik, saya harus melakukan setidaknya 6 pengeditan karakter. Smooth, Stackexchange, smoothSaya ingin memperjelas bahwa Date baru (). GetTime () sebenarnya mengembalikan nilai UTC, jadi ini adalah cara yang sangat membantu untuk menyimpan dan mengelola tanggal dengan cara yang agnostik terhadap waktu yang dilokalkan.
Dengan kata lain, jangan repot-repot dengan semua fungsi javascript UTC. Sebagai gantinya, cukup gunakan Date.getTime ().
Info lebih lanjut tentang penjelasannya ada di sini: Jika javascript "(Tanggal baru ()). GetTime ()" dijalankan dari 2 Zona Waktu yang berbeda.
sumber
Saya menggunakan yang berikut ini:
Setelah mendefinisikan metode ini, Anda dapat melakukan:
sumber
DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
this.getTime()
mengembalikan offset UTC, mengurangi offset zona waktu lokal menjadikannya lokal, bukan UTC jadi dapatkanUTCTime mengembalikan offset lokal, bukan UTC.Saya kagum dengan betapa kompleksnya pertanyaan ini.
Ini semua identik, dan nilai integernya semuanya === EPOCH time: D
Jangan percaya padaku, checkout: http://www.epochconverter.com/
sumber
Karena
new Date().toUTCString()
mengembalikan string seperti"Wed, 11 Oct 2017 09:24:41 GMT"
Anda dapat mengiris 3 karakter terakhir dan meneruskan string yang diiris kenew Date()
:sumber
Sunting: Kode di bawah ini TIDAK berfungsi. Saya selalu berasumsi bahwa Date baru (). GetTime () mengembalikan jumlah detik sejak tanggal 1 Januari 1970 DALAM TIMEZONE SAAT INI. Ini tidak terjadi: getTime () mengembalikan jumlah detik dalam UTC. Jadi, kode di bawah ini tidak terlalu banyak penyesuaian. Terima kasih semuanya!]
Pertama-tama, terima kasih atas wawasan fantastis Anda. Saya kira pertanyaan saya memiliki judul yang salah ... seharusnya "Dapatkan Timestamp UTC Unix untuk tanggal yang ada".
Jadi, jika saya memiliki objek kencan:
Saya mengejar fungsi yang akan memberi tahu saya "The UTC Unix Timestamp".
Fungsi ini tampaknya merupakan trik nyata:
Perhatikan bahwa ini berfungsi pada "ini" Ini berarti saya dapat melakukan:
Dan dapatkan jumlah detik sejak 1 Januari 1970 dalam waktu Unix. Baik?
Agak gila, bagi saya, Javascript menyimpan segala sesuatu dalam waktu UTC, tapi kemudian untuk mendapatkan nomor itu saya harus membuat objek Date baru melewati masing-masing getter UTC dan akhirnya memanggil getTime () untuk itu ...
Merc.
sumber
getUTCUnixTime
mendapatkan waktu yang salah, dan JavaScript memang menyediakan cara mudah untuk mendapatkan cap waktu unix dariDate
objek - menggunakangetTime
metode ini. Lihat semua jawaban lain.Saya pikir ini yang Anda harapkan ...
Sekarang,
sumber
Setelah kamu melakukan ini
Sudah cap waktu UTC
Saya menguji di https://www.unixtimestamp.com/index.php
sumber
Menggunakan day.js
Di browser:
Di node.js:
Anda mendapatkan cap waktu unix UTC tanpa milidetik.
sumber
Ini akan mengembalikan stempel waktu dalam UTC:
sumber
new Date(new Date().toUTCString())
berikan Rabu 04 Oktober 2017 07:20:14 GMT + 0200 (GMT + 02:00)