1

現在タイムスタンプを表示するためにdatetime マイクロフォーマットを使用しているページがありますが、自分のタイムゾーンの人間が読める時間のみを表示しています。

<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 objectを見てきました。これにより、ローカルのタイムゾーン オフセットを取得できます。しかし、いくつか問題があります。

  1. ISO-8601タイムスタンプから新しい Date オブジェクトを作成する簡単な方法がわかりません。(より速い方法がなければ、部分文字列または正規表現で解析できると思います。)

  2. タイムゾーンの略称を取得する方法がわかりません。たとえば、シアトルの読者の場合、時刻の最後に「(PST)」を追加してほしいと思います。そうしないと、タイムスタンプが変換されたことをそのユーザーに明確に伝えることができません (特に、彼が頻繁に訪問し、私の時間がESTにあるという事実に慣れてきました)。

4

2 に答える 2

5

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 + "$");
  }

  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でタイムゾーンの省略形を処理するために私が知っている唯一の解決策は、地域に変更があった場合に手動で最新の状態に保つルックアップテーブルを用意することです。夏時間。

于 2009-01-12T18:59:41.457 に答える
0

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 日時のサポートを追加したかどうかは覚えていませんが、それらを説明するのはそれほど難しくありません。

于 2010-04-13T21:04:47.480 に答える