Tujuan: Menemukan waktu lokal
dan waktu UTC offset
kemudian membangun URL dalam format berikut.
Contoh URL: /Tindakan/Tidur?durasi=2002-10-10T12:00:00-05:00
Format ini didasarkan pada rekomendasi W3C: http://www.w3.org/TR/xmlschema11-2/#dateTime
Dokumentasi mengatakan:
misalnya, 2002-10-10T12:00:00-05:00 (siang hari pada 10 oktober 2002, Pusat Daylight Savings Time serta Waktu Standar Timur di AS) adalah sama dengan 2002-10-10T17:00:00Z, lima jam kemudian dari 2002-10-10T12:00:00Z.
Jadi berdasarkan pemahaman saya, saya harus menemukan waktu setempat oleh new Date() kemudian menggunakan getTimezoneOffset() fungsi untuk menghitung perbedaan kemudian pasang ke akhir dari string.
1.Dapatkan waktu setempat dengan format
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)
output
2013-07-02T09:00:00
2.Mendapatkan waktu UTC offset oleh jam
var offset = local.getTimezoneOffset() / 60;
output
7
3.Membangun URL (waktu paruh hanya)
var duration = local + "-" + offset + ":00";
output:
2013-07-02T09:00:00-7:00
Output di atas berarti saya waktu setempat 2013/07/02 9am dan perbedaan dari UTC 7 jam (UTC 7 jam di depan waktu setempat)
Sejauh ini tampaknya bekerja tetapi bagaimana jika getTimezoneOffset() mengembalikan nilai negatif seperti -120?
I'm bertanya-tanya bagaimana format harus terlihat seperti dalam kasus seperti ini karena aku tidak tahu dari W3C dokumen. Terima kasih sebelumnya.
Di bawah ini harus bekerja dengan benar, dan untuk semua browser (terima kasih untuk @MattJohnson untuk tip)
Date.prototype.toIsoString = function() {
var tzo = -this.getTimezoneOffset(),
dif = tzo >= 0 ? '+' : '-',
pad = function(num) {
var norm = Math.floor(Math.abs(num));
return (norm < 10 ? '0' : '') + norm;
};
return this.getFullYear() +
'-' + pad(this.getMonth() + 1) +
'-' + pad(this.getDate()) +
'T' + pad(this.getHours()) +
':' + pad(this.getMinutes()) +
':' + pad(this.getSeconds()) +
dif + pad(tzo / 60) +
':' + pad(tzo % 60);
}
var dt = new Date();
console.log(dt.toIsoString());
getTimezoneOffset()
mengembalikan berlawanan tanda format yang dipersyaratkan oleh spesifikasi yang dirujuk.
Format ini juga dikenal sebagai ISO8601, atau lebih tepatnya sebagai RFC3339.
Dalam format ini, UTC diwakili dengan Z
sementara semua format lain diwakili oleh offset dari UTC. Artinya sama seperti JavaScript's, tetapi urutan pengurangan terbalik, sehingga hasilnya membawa tanda yang berlawanan.
Juga, tidak ada metode native Tanggal
objek format
, sehingga fungsi anda di #1 akan gagal kecuali anda menggunakan perpustakaan untuk mencapai hal ini. Merujuk ke dokumentasi ini.
Jika anda sedang mencari perpustakaan yang dapat bekerja dengan format ini secara langsung, saya sarankan mencoba moment.js. Pada kenyataannya, ini adalah format default, sehingga anda hanya dapat melakukan ini:
var m = moment(); // get "now" as a moment
var s = m.format(); // the ISO format is the default so no parameters are needed
// sample output: 2013-07-01T17:55:13-07:00
Ini adalah teruji, cross-browser solusi, dan memiliki banyak fitur berguna lainnya.
Ini adalah fungsi untuk klien timezone, it's lite berat badan dan sederhana
function getCurrentDateTimeMySql() {
var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' ');
var mySqlDT = localISOTime;
return mySqlDT;
}
Saya pikir perlu mempertimbangkan bahwa anda dapat mendapatkan info diminta dengan hanya satu panggilan API untuk standar perpustakaan...
new Date().toLocaleString( 'sv', { timeZoneName: 'short' } );
// produces "2019-10-30 15:33:47 GMT−4"
Anda akan memiliki untuk melakukan menukar teks jika anda ingin menambahkan 'T' pembatas, menghapus 'GMT-', atau menambahkan ':00' untuk akhir.
Tapi kemudian anda dapat dengan mudah bermain dengan pilihan jika anda ingin misalnya. gunakan 12h waktu atau menghilangkan detik dll.
Perhatikan bahwa I'm menggunakan Swedia sebagai lokal karena ini adalah salah satu dari negara-negara yang menggunakan format ISO 8601. Saya pikir sebagian besar dari ISO menggunakan negara-negara ini 'GMT-4' format untuk timezone offset lain kemudian Kanada yang menggunakan zona waktu singkatan misalnya. "EDT" timur-siang hari-waktu.
Anda bisa mendapatkan hal yang sama dari baru standar i18n fungsi "Intl.DateTimeFormat()" tapi anda harus memberitahu hal itu termasuk waktu melalui pilihan atau itu hanya akan memberikan tanggal.
Hanya dua saya mengirimkan sini
Saya menghadapi masalah ini dengan datetimes jadi apa yang saya lakukan adalah ini:
const moment = require('moment-timezone')
const date = moment.tz('America/Bogota').format()
Kemudian simpan upload ke db untuk dapat membandingkan dari beberapa query.
Untuk menginstal saat-timezone
npm i moment-timezone
Cek ini:
``javascript fungsi dateToLocalISO(tanggal) { const off = tanggal.getTimezoneOffset() const absoff = Math.abs(off) kembali (new Date(tanggal.getTime() - off601000).toISOString().substr(0,23) + (off > 0 ? '-' : '+') + (absoff / 60).toFixed(0).padStart(2,'0') + ':' + (absoff % 60).toString().padStart(2,'0')) }
// Tes itu: d = new Date()
dateToLocalISO(d) // ==> '2019-06-21T16:07:22.181-03:00'
// Sama dengan:
saat ini = require('saat') saat ini(d).format('YYYY-MM-DDTHH:mm:ss.SSSZ') // ==> '2019-06-21T16:07:22.181-03:00' ``