Отличная программа должна учитывать и I18n, и L10N, но Javascript очень недружелюбен в обработке даты. Проблема проявляется в следующих аспектах:
Хотя Js также устанавливает функцию времени UTC, часовой пояс при запуске скрипта получается автоматически. из системы и не могут быть изменены. В практических приложениях часто необходимо принимать для преобразования данные о времени, которые не находятся в текущем часовом поясе системы. В настоящее время хитрость Js приносит много хлопот.
Автоматический анализ и форматированный вывод дат в JS выполняются по-разному в зависимости от системной среды и среды браузера. Это главным образом отражено в методах Date.parse и toLocaleString. Заинтересованные студенты могут проверить это самостоятельно.
Чтобы как можно проще улучшить возможности обработки даты в Js, для объекта Date в Js
/**
сделано только два расширения.
* Получить временную метку UTC текущего времени
* @return {int} временная метка unix
*/
Date.prototype.getTimeUTC = функция() {
вернуть this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Изменить время текущей операции на часовой пояс (в основном используется для перевода времени в другой часовой пояс)
*
* @param {int} tzo исходный часовой пояс - 12~13
* @param {int} tzo target time Zone-12~13 по умолчанию соответствует текущему часовому поясу.
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
цо = цо * 60;
tzn = tzn ? tzn * 60: -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* Получить временную метку UTC текущего времени
* @return {int} временная метка unix
*/
Date.prototype.getTimeUTC = функция() {
вернуть this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Изменить время текущей операции на часовой пояс (в основном используется для перевода времени в другой часовой пояс)
*
* @param {int} tzo исходный часовой пояс - 12~13
* @param {int} tzo target time Zone-12~13 по умолчанию соответствует текущему часовому поясу.
*/
Date.prototype.changeTimezone = function(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
// автоматически проанализировать его в временную метку unix
var p = Date.parse('4 июня 2008, 16:30');
вар time_parse = новая дата (р);
//Преобразуем в часовой пояс для сравнения
time_parse.changeTimezone(8,9);
вар time_now = новая дата ();
//Преобразуем в UTC для сравнения
вар дер = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('разница' + parseInt(der/1000/60) + 'минуты');
//Автоматически анализируем временную метку Unix
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()
alert('difference' + parseInt(der / 1000/60) + 'минуты');
Конечно, есть более простые коды, но они менее подвержены ошибкам для уточнения идей в сложных приложениях.
Если вы хотите реализовать более удобное для пользователя напоминание, например XX дней XX месяцев назад, в левом столбце этого блога, вы можете расширить его здесь в соответствии со своими потребностями. Реализованные функции следующие:
/**
* представляет разницу между указанным временем и настоящим моментом
*
* @param {int} t Время для сравнения, временная метка Unix (UTC)
* @param {int} n в качестве стандартного времени, по умолчанию используется текущая временная метка unix (UTC).
* @return {строка} выражение разницы во времени
*/
Date.prototype.derTime = function(t,n) {
вар n = n ? n: this.getTimeUTC();
функция мс2мин(мс) {
вернуть parseInt(мс/1000/60);
}
вар дер = ms2min(n - t);
вар ба = дер > 0 'до': 'после';
дер = Math.abs(дер);
вар рез = '';
если (дер == 0) {
рез = 'просто';
}
иначе if(0 < дер && дер < 60) {
res = дер + 'минута' + ба;
}
иначе if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 '': String(der % 60) + 'минуты';
res = String(parseInt(der / 60)) + 'час' + мин + ба;
}
иначе if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der/60/24)) + 'день' + ба;
}
else if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der/60/24/31)) + 'месяц' + ba;
}
иначе если(дер > 24 * 60 * 365) {
res = String(parseInt(der/60/24/365)) + 'год' + ba;
}
вернуть разрешение;
}
/**
* Анализ разницы между полем времени и текущим временем
* @param {строка} i
* @param {int} часовой пояс-12~13
*/
функция time_der(i,tz) {
вар p = Date.parse(i);
если(!р) {
вернуть я;
}
вар time_parse = новая дата (р);
if(tz != не определено) {
time_parse.changeTimezone(tz);
}
вар time_now = новая дата ();
return time_now.derTime(time_parse.getTimeUTC());