يجب أن يأخذ البرنامج الممتاز في الاعتبار كلاً من I18n وL10N، لكن Javascript غير ودود للغاية في معالجة التاريخ. تنعكس المشكلة في الجوانب التالية:
على الرغم من أن Js تقوم أيضًا بتعيين وظيفة التوقيت UTC، إلا أنه يتم الحصول على المنطقة الزمنية عند تشغيل البرنامج النصي تلقائيًا. من النظام ولا يمكن تغييره في التطبيقات العملية، غالبًا ما يكون من الضروري قبول بيانات الوقت غير الموجودة في المنطقة الزمنية الحالية للنظام للتحويل. في هذا الوقت، يجلب ذكاء Js الكثير من المتاعب.
يعمل التحليل التلقائي والإخراج المنسق للتواريخ في JS بشكل مختلف اعتمادًا على بيئة النظام وبيئة المتصفح، وينعكس هذا بشكل أساسي في طريقتي Date.parse وtoLocaleString، ويمكن للطلاب المهتمين اختباره بأنفسهم.
من أجل تحسين قدرات معالجة التاريخ لـ Js بسهولة قدر الإمكان، تم إجراء ملحقين فقط لكائن التاريخ لـ Js
/**
* احصل على الطابع الزمني UTC للوقت الحالي
* @return {int} الطابع الزمني لليونيكس
*/
Date.prototype.getTimeUTC = function() {
إرجاع this.getTime() + this.getTimezoneOffset() * 60 * 1000؛
}
/**
* تغيير وقت العملية الحالية إلى المنطقة الزمنية (تستخدم بشكل أساسي لتحويل الوقت في منطقة زمنية أخرى)
*
* @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 * 1000);
}
/**
* احصل على الطابع الزمني UTC للوقت الحالي
* @return {int} الطابع الزمني لليونيكس
*/
Date.prototype.getTimeUTC = function() {
إرجاع this.getTime() + this.getTimezoneOffset() * 60 * 1000؛
}
/**
* تغيير وقت العملية الحالية إلى المنطقة الزمنية (تستخدم بشكل أساسي لتحويل الوقت في منطقة زمنية أخرى)
*
* @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 * 1000);
}
عند هذه النقطة، يمكن إجراء تطوير جديد بناءً على كائن Js Date الممتد.
الفكرة بسيطة للغاية، وهي أولاً نقل الوقت بأي تنسيق ومنطقة زمنية إلى نفس المنطقة الزمنية للنظام الحالي من خلال طريقة ChangeTimezone، ثم العمل على الطابع الزمني UTC Unix الذي تم إنشاؤه بواسطة getTimeUTC.
على سبيل المثال، أريد حساب فارق التوقيت بين 4 يونيو 2008، الساعة 16:30 في المنطقة الزمنية +8 والوقت الحالي في المنطقة الزمنية +9
// تحليله تلقائيًا إلى طابع زمني يونكس
var p = Date.parse('4 يونيو 2008، 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();
تنبيه('الفرق' + parseInt(der / 1000 / 60) + 'دقيقة');
// التحليل تلقائيًا إلى الطابع الزمني لنظام التشغيل Unix
var p = Date.parse('4 يونيو 2008، 16:30');
=
new Date(p);
time_parse.changeTimezone(8,9);
var time_now = new Date();
// تحويل إلى UTC للمقارنة
var der = time_now.getTimeUTC() - time_parse.getTimeUTC()
تنبيه('الفرق' + parseInt(der / 1000 / 60) + 'دقيقة');
بالطبع هناك رموز أبسط، لكنها أقل عرضة للخطأ عند توضيح الأفكار في التطبيقات المعقدة.
إذا كنت تريد تنفيذ تذكير أكثر سهولة في الاستخدام مثل XX يومًا قبل XX شهرًا في العمود الأيسر من هذه المدونة، فيمكنك توسيعه هنا وفقًا لاحتياجاتك. الوظائف المنفذة هي كما يلي
/**
* يمثل الفرق بين الوقت المحدد والآن
*
* @param {int} t الوقت المراد مقارنته بالطابع الزمني لنظام التشغيل Unix (UTC)
* @param {int} n باعتباره الوقت القياسي، الافتراضي هو الطابع الزمني الحالي لنظام Unix (UTC)
* @return {string} تعبير عن فرق الوقت
*/
Date.prototype.derTime = الوظيفة(t,n) {
var n = n ?
وظيفة ms2min(ms) {
إرجاع parseInt(ms / 1000 / 60);
}
فار دير = ms2min(n - t);
var ba = der > 0 ?
der = Math.abs(der);
فار الدقة = '';
إذا (دير == 0) {
الدقة = 'فقط'؛
}
وإلا إذا (0 <دير && دير <60) {
الدقة = دير + 'دقيقة' + با؛
}
وإلا إذا(60 <= دير && دير < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + 'Minutes';
res = String(parseInt(der / 60)) + 'hour' + min + ba;
}
وإلا إذا (دير >= 24 * 60 && دير < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + 'day' + ba;
}
وإلا إذا (دير >= 24 * 60 * 31 && دير < 24* 60 * 365) {
res = String(parseInt(der / 60 / 24 / 31)) + 'month' + ba;
}
وإلا إذا (دير > 24 * 60 * 365) {
res = String(parseInt(der / 60 / 24 / 365)) + 'year' + ba;
}
دقة العودة؛
}
/**
* تحليل الفرق بين حقل الوقت والوقت الحالي
* @param {string} ط
* @param {int} المنطقة الزمنية-12~13
*/
وظيفة time_der(i,tz) {
var p = Date.parse(i);
إذا (! ع) {
العودة أنا؛
}
var time_parse = new Date(p);
إذا (تز!= غير محدد) {
time_parse.changeTimezone(tz);
}
var time_now = new Date();
إرجاع time_now.derTime(time_parse.getTimeUTC());