javascriptでdatetime microformatを現地時間に変換するにはどうすればよいですか?
-
22-07-2019 - |
質問
現在、 datetime microformat を使用してタイムスタンプを表示しているページがあります、しかし、私は自分のタイムゾーンで人間が読める時間しか表示していません:
<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 9:16 am (EST)</abbr>
私がやりたいのは、abbrタグのinnerHTMLを同じ形式に変更しますが、ユーザーのローカルタイムゾーンになります。シアトルの読者の場合、上記は次のように変換する必要があります。
<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 6:16 am (PST)</abbr>
Javascript Dateオブジェクトを見て、取得することができますローカルタイムゾーンオフセット。しかし、いくつかの問題があります:
-
ISO-から新しいDateオブジェクトを作成する簡単な方法がありません。 8601 タイムスタンプ。 (より高速な方法がない場合、部分文字列または正規表現で解析できると思います。)
-
タイムゾーンの名前の省略形を取得する方法がわかりません。たとえば、シアトルの読者の場合は、「(PST)」が必要です。それ以外の場合、タイムスタンプが変換されていることはユーザーに明確ではありません(特に、頻繁に訪問者であり、私の時間がESTにあるという事実に慣れている場合)。
解決
ISOタイムスタンプを解析するコードは次のとおりです。
function isoDateStringToDate (datestr) {
if (! this.re) {
// The date in YYYY-MM-DD or YYYYMMDD format
var datere = "(\\d{4})-?(\\d{2})-?(\\d{2})";
// The time in HH:MM:SS[.uuuu] or HHMMSS[.uuuu] format
var timere = "(\\d{2}):?(\\d{2}):?(\\d{2}(?:\\.\\d+)?)";
// The timezone as Z or in +HH[:MM] or -HH[:MM] format
var tzre = "(Z|(?:\\+|-)\\d{2}(?:\\:\\d{2})?)?";
this.re = new RegExp("^" + datere + "[ T]" + timere + tzre + "<*>quot;);
}
var matches = this.re.exec(datestr);
if (! matches)
return null;
var year = matches[1];
var month = matches[2] - 1;
var day = matches[3];
var hour = matches[4];
var minute = matches[5];
var second = Math.floor(matches[6]);
var ms = matches[6] - second;
var tz = matches[7];
var ms = 0;
var offset = 0;
if (tz && tz != "Z") {
var tzmatches = tz.match(/^(\+|-)(\d{2})(\:(\d{2}))$/);
if (tzmatches) {
offset = Number(tzmatches[2]) * 60 + Number(tzmatches[4]);
if (tzmatches[1] == "-")
offset = -offset;
}
}
offset *= 60 * 1000;
var dateval = Date.UTC(year, month, day, hour, minute, second, ms) - offset;
return new Date(dateval);
}
残念ながら、タイムゾーンの省略形も処理しません。 「tzre」を変更する必要があります。 Javascriptでタイムゾーンの略語を処理するために知っている唯一の解決策は、地域の夏時間に変更があった場合に手動で最新の状態に保つルックアップテーブルを持つことです。
他のヒント
EcmaScriptは、JavaScriptの日付の入力としてISO-8601スタイルの文字列の追加を形式化しました。ほとんどのJS実装ではこれがサポートされていないため、この機能を備えたDateオブジェクトのラッパーを作成しました。 UTC / GMT / Z / Zuluオフセットで出力するようにタイトルタグを設定した場合、 JSのDateオブジェクト用のEcmaScript 5拡張機能。
クライアント側スクリプトで使用されるDateTime値については、通常、次のことを常に実行しようとします。 UTCゾーンに日付と時刻を保存します(データベースにも)。 UTCゾーンで日時を送信します。クライアントからサーバーへ、上記のリンクで.toISOString()メソッドを使用できます。サーバーからクライアントまで、これは比較的簡単です。
jQuery経由(拡張子付き):
$('.published').each(function(){
var dtm = new Date(this.title);
if (!isNaN(dtm)) {
this.text(dtm.toString());
}
});
入力に非UTC日付時刻のサポートを追加したかどうかは思い出せませんが、それらを説明するのはそれほど難しくありません。