0

状況は次のとおりです。

occurred_atデータベースに UTC で日付を保存しています。laravel を使用して、これらのoccurred_atフィールドを含むレコードを返す API メソッドを作成しています。これらは現在、JSON を介して文字列形式 (PHP Carbon ライブラリが出力するもの) で返されています。例:

"occurred_at":"2015-04-14 00:25:20" この日付は UTC タイムゾーンの00:25( 12:25 AM) に「発生」しましたが、実際には太平洋 (PST) タイムゾーンの2015-04-13 17:25( ) に発生しました。5:25 PM

私は angular を使用して JSON を使用しており、angular-moment ライブラリを使用して UTC をローカルに変換すると考えました。しかし、それは機能していません。角度モーメント フィルターとネイティブ角度フィルターの両方が同じものを出力します。

<span>{{evt.occurred_at | amDateFormat:'L LT'}}</span> <span>{{evt.occurred_at | date:'MM/dd/yyyy @ h:mma'}}</span>

出力:

2015-04-14 00:25:20

まだUTCです。私のangularアプリコードでは、UTCプリプロセッサをセットアップしてUTCとして読み込むことさえありますが、現地時間として表示されません:

.constant('angularMomentConfig', { preprocess: 'utc' })

これには標準的な方法が必要です。日時の値をUTCでデータベースに保存しますが、ユーザーにはローカル時間として表示します。サーバー側に変更を加える必要がありますか? クライアント側?表示したい日付ごとに大量のコードを書かずに、「うまくいく」方法を利用するためのベストプラクティスは何ですか?

現在、角度のないプロジェクトでは、時間をローカルに変換するすべてのスパンに css クラスを適用することにより、「ハック」と見なされるものを使用しています。

$('.utc-dttm').each(function () {
    var t = moment.utc($(this).text()).local();
    $(this).text(t.format("L") + ' ' + t.format("LT"));
});

しかし、私はこれが間違った方法であると主張します。

4

2 に答える 2

1

有効な JSON 日時文字列は ISO-8601 形式でフォーマットされているため、Carbon で日付値をこの形式に変換してからtoIso8601String、次のようにクライアントに返す必要があります。

$occurred_at->toIso8601String();

これにより、日付文字列が次のように出力されます

2015-04-14T00:25:20Z

どの JavaScript および任意の日付拡張ライブラリが UTC タイムゾーンであるとしてネイティブに解析し、ユーザーへの出力時にクライアントのタイムゾーンに調整する必要があります。

于 2015-04-14T04:47:49.207 に答える
0

時間を取得する別の関数を作成することはできませんか? 同様に、最初に時間を節約する関数を取得します。

localStorage.setItem('time', +new Date);

変換するには:

function toTimeZone(time, zone) {
var format = 'YYYY/MM/DD HH:mm:ss ZZ';
return moment(time, format).tz(zone).format(format);

}

取得したい場合:

new Date(parseInt(localStorage.getItem('time')));

ソース: JavaScript で日付を別のタイムゾーンに変換する+日付を保存し、ローカル ストレージから取得する

于 2015-04-14T01:33:12.157 に答える