優れたプログラムでは I18n と L10N の両方を考慮する必要がありますが、JavaScript は日付処理において非常に不親切です。この問題は次の点に反映されています。Js
は UTC 時刻関数も設定しますが、スクリプト実行時のタイムゾーンは自動的に取得されます。システムから削除されるため、変更することはできません。実際のアプリケーションでは、現在のシステムのタイムゾーンにない時刻データを変換のために受け入れる必要があることがよくありますが、このとき、Js の賢さは多くの問題を引き起こします。
JS の自動解析と日付の書式設定された出力は、システム環境とブラウザ環境に応じて異なります。これは主に Date.parse メソッドと toLocaleString メソッドに反映されます。興味のある学生は自分でテストできます。
Js の Date 処理機能をできるだけ簡単に改善するために、Js
/**
の Date オブジェクトに対して 2 つの拡張のみが行われます。
* 現在時刻の UTC タイムスタンプを取得します
* @return {int} UNIX タイムスタンプ
*/
Date.prototype.getTimeUTC = function() {
this.getTime() + this.getTimezoneOffset() * 60 * 1000 を返します。
}
/**
* 現在の操作の時間をタイムゾーンに変更します(主に別のタイムゾーンの時間を変換するために使用されます)
*
* @param {int} tzo オリジナルタイムゾーン-12~13
* @param {int} tzo target timezone-12~13 のデフォルトは現在のタイムゾーンです
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* 現在時刻の UTC タイムスタンプを取得します
* @return {int} UNIX タイムスタンプ
*/
Date.prototype.getTimeUTC = function() {
this.getTime() + this.getTimezoneOffset() * 60 * 1000 を返します。
}
/**
* 現在の操作の時間をタイムゾーンに変更します(主に別のタイムゾーンの時間を変換するために使用されます)
*
* @param {int} tzo オリジナルタイムゾーン-12~13
* @param {int} tzo target timezone-12~13 のデフォルトは現在のタイムゾーンです
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
この時点で、この拡張された Js Date オブジェクトに基づいて新しい開発を実行できます。
考え方は非常に簡単です。つまり、まず、changeTimezone メソッドを使用して、任意の形式およびタイム ゾーンの時刻を現在のシステムと同じタイム ゾーンに転送し、次に getTimeUTC によって生成された UTC Unix タイムスタンプを操作します。
たとえば、+8 タイム ゾーンの 2008 年 6 月 4 日 16:30 と +9 タイム ゾーンの現在時刻との時差を計算したいとします
// 自動的に Unix タイムスタンプに解析します
var p = Date.parse('2008 年 6 月 4 日、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 / 1000 / 60) + '分');
//自動的に Unix タイムスタンプに解析します
var p = Date.parse('2008年6月4日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('差分' + parseInt(der / 1000 / 60) + '分');
もちろん、より単純なコードもありますが、複雑なアプリケーションのアイデアを明確にする方がエラーが発生しにくくなります。
このブログの左側の列に、XX 日 XX か月前のような、より使いやすいリマインダーを実装したい場合は、ニーズに応じてここでさらに拡張できます。実装されている機能は以下の通りです
/**
* は指定した時刻と現在との差を表します
*
* @param {int} t 比較される時刻 UNIX タイムスタンプ (UTC)
* @param {int} n は標準時間であり、デフォルトは現在時間の Unix タイムスタンプ (UTC) になります。
* @return {string} 差分時間の式
*/
Date.prototype.derTime = function(t,n) {
var n = n ? n : this.getTimeUTC();
関数 ms2min(ms) {
return parseInt(ms / 1000 / 60);
}
var der = ms2min(n - t);
var ba = der > 0 ? '前' : '後';
der = Math.abs(der);
var res = '';
if(der == 0) {
res = 'ちょうど';
}
else if(0 < der && der < 60) {
res = der + '分' + ba;
}
else if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + '分';
res = String(parseInt(der / 60)) + '時間' + 分 + ba;
}
else if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + '日' + ba;
}
else if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der / 60 / 24 / 31)) + '月' + ba;
}
else if(der > 24 * 60 * 365) {
res = String(parseInt(der / 60 / 24 / 365)) + '年' + ba;
}
応答を返します。
}
/**
* 時間フィールドと現在時刻の差を解析します
* @param {文字列} i
* @param {int} タイムゾーン-12~13
*/
関数 time_der(i,tz) {
var p = Date.parse(i);
if(!p) {
私を返します。
}
var time_parse = 新しい日付(p);
if(tz != 未定義) {
time_parse.changeTimezone(tz);
}
var time_now = 新しい日付();
return time_now.derTime(time_parse.getTimeUTC());