โปรแกรมที่ยอดเยี่ยมจะต้องคำนึงถึงทั้ง I18n และ L10N แต่ Javascript นั้นไม่เป็นมิตรอย่างมากในการประมวลผลวันที่ ปัญหาดังกล่าวสะท้อนให้เห็นในด้านต่อไปนี้:
แม้ว่า Js จะตั้งค่าฟังก์ชันเวลา UTC ด้วย แต่เขตเวลาที่สคริปต์กำลังทำงานอยู่จะได้รับโดยอัตโนมัติ ออกจากระบบและไม่สามารถเปลี่ยนแปลงได้ ในการใช้งานจริง มักจะจำเป็นต้องยอมรับข้อมูลเวลาที่ไม่ได้อยู่ในเขตเวลาของระบบปัจจุบันสำหรับการแปลง ในเวลานี้ ความฉลาดของ Js นำมาซึ่งปัญหามากมาย
การแยกวิเคราะห์และการจัดรูปแบบอัตโนมัติของ JS จะทำงานแตกต่างกันไปขึ้นอยู่กับสภาพแวดล้อมของระบบและสภาพแวดล้อมของเบราว์เซอร์ ซึ่งส่วนใหญ่จะสะท้อนให้เห็นในเมธอด Date.parse และ toLocaleString นักเรียนที่สนใจสามารถทดสอบได้ด้วยตัวเอง
เพื่อที่จะปรับปรุงความสามารถในการประมวลผลวันที่ของ Js ได้ง่ายที่สุด จึงมีเพียงสองส่วนขยายเท่านั้นที่ถูกสร้างให้กับอ็อบเจ็กต์ Date ของ Js
/**
* รับการประทับเวลา UTC ของเวลาปัจจุบัน
* @return {int} การประทับเวลายูนิกซ์
-
Date.prototype.getTimeUTC = ฟังก์ชั่น () {
กลับ this.getTime() + this.getTimezoneOffset() * 60 * 1,000;
-
-
* เปลี่ยนเวลาของการดำเนินการปัจจุบันเป็นเขตเวลา (ส่วนใหญ่จะใช้เพื่อแปลงเวลาในเขตเวลาอื่น)
-
* @param {int} tzo โซนเวลาดั้งเดิม-12~13
* @param {int} tzo โซนเวลาเป้าหมาย-12~13 มีค่าเริ่มต้นเป็นโซนเวลาปัจจุบัน
-
Date.prototype.changeTimezone = ฟังก์ชั่น (tzo, tzn) {
ทีโซ = ทีโซ * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1,000);
-
-
* รับการประทับเวลา UTC ของเวลาปัจจุบัน
* @return {int} การประทับเวลายูนิกซ์
-
Date.prototype.getTimeUTC = ฟังก์ชั่น () {
กลับ this.getTime() + this.getTimezoneOffset() * 60 * 1,000;
-
-
* เปลี่ยนเวลาของการดำเนินการปัจจุบันเป็นเขตเวลา (ส่วนใหญ่จะใช้เพื่อแปลงเวลาในเขตเวลาอื่น)
-
* @param {int} tzo โซนเวลาดั้งเดิม-12~13
* @param {int} tzo โซนเวลาเป้าหมาย-12~13 มีค่าเริ่มต้นเป็นโซนเวลาปัจจุบัน
-
Date.prototype.changeTimezone = ฟังก์ชั่น (tzo, tzn) {
ทีโซ = ทีโซ * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1,000);
-
ณ จุดนี้ การพัฒนาใหม่สามารถดำเนินการได้โดยใช้อ็อบเจ็กต์ Js Date ที่ขยายเพิ่มนี้
แนวคิดนี้ง่ายมาก กล่าวคือ ขั้นแรกให้โอนเวลาในรูปแบบและโซนเวลาใดๆ ไปยังโซนเวลาเดียวกันกับระบบปัจจุบันโดยใช้เมธอด changeTimezone จากนั้นจึงดำเนินการกับการประทับเวลา UTC Unix ที่สร้างโดย getTimeUTC
ตัวอย่างเช่น ฉันต้องการคำนวณความแตกต่างของเวลาระหว่างวันที่ 4 มิถุนายน 2551 เวลา 16:30 น. ในเขตเวลา +8 และเวลาปัจจุบันในเขตเวลา +9
// แยกวิเคราะห์เป็นการประทับเวลา Unix โดยอัตโนมัติ
var p = Date.parse('4 มิ.ย. 2551, 16:30');
var time_parse = วันที่ใหม่ (p);
//แปลงเป็นเขตเวลาที่จะเปรียบเทียบ
time_parse.changeTimezone(8,9);
var time_now = วันที่ใหม่ ();
//แปลงเป็น UTC เพื่อเปรียบเทียบ
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('ความแตกต่าง' + parseInt(der / 1,000/60) + 'นาที');
// แยกวิเคราะห์การประทับเวลา Unix โดยอัตโนมัติ
var p = Date.parse('4 มิ.ย. 2551, 16:30 น.');
var time_parse = new Date(p);
// แปลงเป็นเขตเวลาที่จะเปรียบเทียบ
time_parse.changeTimezone(8,9);
var time_now = new Date();
// แปลงเป็น UTC เพื่อเปรียบเทียบ
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('difference' + parseInt(der / 1000/60) + 'นาที');
แน่นอนว่ามีโค้ดที่ง่ายกว่า แต่มีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยกว่าในการชี้แจงแนวคิดในแอปพลิเคชันที่ซับซ้อน
หากคุณต้องการใช้การแจ้งเตือนที่เป็นมิตรต่อผู้ใช้มากขึ้น เช่น XX วัน XX เดือนที่แล้ว ในคอลัมน์ด้านซ้ายของบล็อกนี้ คุณสามารถขยายเพิ่มเติมได้ที่นี่ตามความต้องการของคุณ ฟังก์ชั่นที่นำไปใช้มีดังนี้
/**
* แสดงถึงความแตกต่างระหว่างเวลาที่กำหนดกับปัจจุบัน
-
* @param {int} t เวลาที่จะเปรียบเทียบเวลาประทับ Unix (UTC)
* @param {int} n เป็นเวลามาตรฐาน ค่าเริ่มต้นเป็นเวลาปัจจุบัน unix timestamp (UTC)
* @return {string} นิพจน์ของเวลาที่แตกต่าง
-
Date.prototype.derTime = ฟังก์ชั่น (t, n) {
var n = n ? n : this.getTimeUTC();
ฟังก์ชั่น ms2min(ms) {
กลับ parseInt(ms / 1,000/60);
-
var der = ms2min(n - t);
var ba = เดอร์ > 0 ?
เดอร์ = Math.abs (เดอร์);
var ความละเอียด = '';
ถ้า (เดอร์ == 0) {
ความละเอียด = 'เพียง';
-
อื่นถ้า (0 < เดอร์ && เดอร์ < 60) {
res = der + 'นาที' + ba;
-
อย่างอื่นถ้า (60 <= เดอร์ && เดอร์ < 24 * 60) {
var min = der % 60 == 0 ? '' : สตริง (der % 60) + 'นาที';
res = String(parseInt(der / 60)) + 'ชั่วโมง' + min + ba;
-
อย่างอื่นถ้า (เดอร์ >= 24 * 60 && เดอร์ < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + 'วัน' + ba;
-
อย่างอื่นถ้า (เดอร์ >= 24 * 60 * 31 && เดอร์ < 24* 60 * 365) {
res = String(parseInt(der / 60 / 24 / 31)) + 'เดือน' + ba;
-
อย่างอื่นถ้า (เดอร์ > 24 * 60 * 365) {
res = String(parseInt(der / 60 / 24 / 365)) + 'ปี' + ba;
-
ส่งคืนความละเอียด;
-
-
* แยกวิเคราะห์ความแตกต่างระหว่างเขตเวลาและเวลาปัจจุบัน
* @param {string} i
* @param {int} โซนเวลา-12~13
-
ฟังก์ชั่น time_der (i, tz) {
var p = Date.parse(i);
ถ้า(!p) {
ส่งคืนฉัน;
-
var time_parse = วันที่ใหม่ (p);
ถ้า (tz != ไม่ได้กำหนด) {
time_parse.changeTimezone(tz);
-
var time_now = วันที่ใหม่ ();
กลับ time_now.derTime(time_parse.getTimeUTC());