0

組み込みの Angular 日付フィルターは、json 文字列を入力として受け取り、(正規表現を介して) タイムゾーン データを検索し、UTC 時間で日付オブジェクトを返します。すべて問題ありません。サーバーに日付を UTC で保存する必要があることは理解しています。

日付部分 (タイムゾーン情報なし) を保存するだけで、その日付を UTC に変換したくない状況があります (「2013-06-30T00:00:00.000」は、サーバーから返された日付文字列です。私のロケールは GMT-0400 (東部夏時間) であるため、これは正しいです)。

Angular の既存の日付フィルターをオーバーライドするカスタム日付フィルターを作成したいので、以下を使用する代わりに:

date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));

行 10131-10132 (v1.0.7) から、次を使用したい:

date.setFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
date.setHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));

フィルターの他のすべての部分 (正規表現、書式設定など) を活用できるようにしたいと考えています。UTC 変換が必要な領域で多くの望ましくない結果が生じるため、ネイティブ実装を変更したくないことは明らかです。

どんな援助でも大歓迎です。

更新: @pkozlowski.opensource ごとに、1.1.5 に更新しました (手動で、Nuget には 1.07 しかありません)。興味深いことに、これが新しい実装です。

function jsonStringToDate(string) {
  var match;
  if (match = string.match(R_ISO8601_STR)) {
  var date = new Date(0),
      tzHour = 0,
      tzMin  = 0,
      dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
      timeSetter = match[8] ? date.setUTCHours : date.setHours;

    if (match[9]) {
      tzHour = int(match[9] + match[10]);
      tzMin = int(match[9] + match[11]);
    }
    dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
    var h = int(match[4]||0) - tzHour;
    var m = int(match[5]||0) - tzMin
    var s = int(match[6]||0);
    var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
    timeSetter.call(date, h, m, s, ms);
    return date;
  }
  return string;
}

match[8] (タイムゾーン情報) が定義されていない場合、setUTCFull[Year|Hours] の代わりに setFull[Year|Hours] を呼び出します。非常に素晴らしい。

4

1 に答える 1

1

不安定なブランチで修正されたと思います。1.1.5 で日付 (文字列として) が UTC ではなくローカル タイム ゾーンで解釈されることを確認してください。

于 2013-06-30T15:24:35.860 に答える