Program yang sangat baik harus memperhitungkan I18n dan L10N, tetapi Javascript sangat tidak ramah dalam pemrosesan Tanggal. Masalahnya tercermin dalam aspek berikut:
Meskipun Js juga menetapkan fungsi waktu UTC, zona waktu saat skrip dijalankan secara otomatis Diperoleh. dari sistem dan tidak dapat diubah. Dalam aplikasi praktis, seringkali diperlukan untuk menerima data waktu yang tidak berada dalam zona waktu sistem saat ini untuk konversi. Pada saat ini, kepintaran Js membawa banyak masalah.
Penguraian otomatis JS dan keluaran tanggal yang diformat bekerja secara berbeda tergantung pada lingkungan sistem dan lingkungan browser. Hal ini terutama tercermin dalam metode Date.parse dan toLocaleString. Siswa yang tertarik dapat mengujinya sendiri.
Untuk meningkatkan kemampuan pemrosesan Tanggal Js semudah mungkin, hanya dua ekstensi yang dibuat ke objek Tanggal Js
/**
* Dapatkan stempel waktu UTC waktu saat ini
* @return {int} stempel waktu unix
*/
Tanggal.prototipe.getTimeUTC = function() {
kembalikan ini.getTime() + ini.getTimezoneOffset() * 60 * 1000;
}
/**
* Ubah waktu operasi saat ini ke zona waktu (terutama digunakan untuk mengubah waktu di zona waktu lain)
*
* @param {int} tzo zona waktu asli-12~13
* @param {int} tzo menargetkan zona waktu-12~13 default ke zona waktu saat ini
*/
Tanggal.prototipe.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ?tzn * 60 : -ini.getTimezoneOffset();
ini.setTime(ini.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* Dapatkan stempel waktu UTC waktu saat ini
* @return {int} stempel waktu unix
*/
Tanggal.prototipe.getTimeUTC = function() {
kembalikan ini.getTime() + ini.getTimezoneOffset() * 60 * 1000;
}
/**
* Ubah waktu operasi saat ini ke zona waktu (terutama digunakan untuk mengubah waktu di zona waktu lain)
*
* @param {int} tzo zona waktu asli-12~13
* @param {int} tzo menargetkan zona waktu-12~13 default ke zona waktu saat ini
*/
Tanggal.prototipe.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ?tzn * 60 : -ini.getTimezoneOffset();
ini.setTime(ini.getTime() - (tzo - tzn) * 60 * 1000);
}
Pada titik ini, pengembangan baru dapat dilakukan berdasarkan objek Js Date yang diperluas ini.
Idenya sangat sederhana, yaitu pertama-tama transfer waktu dalam format dan zona waktu apa pun ke zona waktu yang sama dengan sistem saat ini melalui metode changeTimezone, lalu operasikan pada stempel waktu UTC Unix yang dihasilkan oleh getTimeUTC.
Misalnya, saya ingin menghitung perbedaan waktu antara 4 Juni 2008, 16:30 di zona waktu +8 dan waktu saat ini di zona waktu +9
// secara otomatis menguraikannya menjadi stempel waktu unix
var p = Tanggal.parse('4 Juni 2008, 16:30');
var time_parse = Tanggal baru(p);
//Konversikan ke zona waktu yang akan dibandingkan
time_parse.changeTimezone(8,9);
var time_now = Tanggal baru();
//Konversikan ke UTC untuk perbandingan
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('perbedaan' + parseInt(der / 1000/60) + 'menit');
// Secara otomatis menguraikan ke dalam stempel waktu unix
var p = Date.parse('4 Jun 2008, 16:30');
var time_parse = new Date(p);
//Konversi ke zona waktu yang akan dibandingkan
time_parse.changeTimezone(8,9);
var time_now = new Date();
//Konversi ke UTC untuk perbandingan
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
peringatan('perbedaan' + parseInt(der / 1000/60) + 'menit');
Tentu saja ada kode yang lebih sederhana, namun tidak terlalu rentan terhadap kesalahan untuk memperjelas ide dalam aplikasi yang kompleks.
Jika Anda ingin menerapkan pengingat yang lebih ramah pengguna seperti XX hari XX bulan lalu di kolom kiri blog ini, Anda dapat mengembangkannya lebih lanjut di sini sesuai kebutuhan Anda. Fungsi yang diterapkan adalah sebagai berikut
/**
* mewakili perbedaan antara waktu yang ditentukan dan sekarang
*
* @param {int} t Waktu untuk dibandingkan stempel waktu unix (UTC)
* @param {int} n sebagai waktu standar, defaultnya adalah stempel waktu unix waktu saat ini (UTC)
* @return {string} ekspresi perbedaan waktu
*/
Tanggal.prototipe.derTime = function(t,n) {
var n = n ? n : ini.getTimeUTC();
fungsi ms2 menit(ms) {
kembali parseInt(ms/1000/60);
}
var der = ms2min(n - t);
var ba = der > 0 ? 'sebelum' : 'setelah';
der = Matematika.abs(der);
var res = '';
jika(der == 0) {
res = 'hanya';
}
else if(0 < der && der < 60) {
res = der + 'menit' + ba;
}
else if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + 'menit';
res = String(parseInt(der / 60)) + 'jam' + menit + ba;
}
else if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60/24)) + 'hari' + ba;
}
else if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der / 60/24/31)) + 'bulan' + ba;
}
lain jika(der > 24*60*365) {
res = String(parseInt(der / 60/24/365)) + 'tahun' + ba;
}
kembalikan res;
}
/**
* Parsing perbedaan antara bidang waktu dan waktu saat ini
* @param {string} i
* @param {int} zona waktu-12~13
*/
fungsi waktu_der(i,tz) {
var p = Tanggal.parse(i);
jika(!p) {
kembalikan saya;
}
var time_parse = Tanggal baru(p);
jika(tz != tidak terdefinisi) {
time_parse.changeTimezone(tz);
}
var time_now = Tanggal baru();
return time_now.derTime(time_parse.getTimeUTC());