2

私のアプリは、UI に表示するために特定のユーザー イベントをログに記録しています。タイムスタンプはMongoに日付として保存され、サーバーのタイムゾーンに関連するタイムゾーン情報とともにJS Dateオブジェクトになります。

私はmoment.jsを使用して日付をフォーマットしていますが、私のユーザーはオーストラリアにいて、私のアプリはHeroku (サーバーのタイムゾーンは UTC) でホストされているため、moment.js が出力する「ローカル」時間は私のユーザーのものではありません。見たい。

Moment.js を使用すると、UTC と「ローカル」時間 (サーバー上) を切り替えることができますが、異なるタイムゾーンのコンテキストで出力することはできないようです。

(サーバーのタイムゾーンを変更しても、根本的な問題は解決しません。一部のユーザーにとっては、これも間違っています。)

ノード時間ライブラリを使用して日付のタイムゾーンを変更しようとしましたが、Date.toString() を使用してタイムスタンプを出力するだけで機能しますが、日付が Moment.js によってラップされている場合は元に戻りますサーバーのタイムゾーン。

ユーザー ローカル タイムゾーンとサーバー ローカル タイムゾーンの差を計算し、Moment.js によってフォーマットされる前に日付を変更することで解決策を練ることができますが、(a) より洗練された解決策、または (b) のいずれかがあることを願っています。 )これを行う優れたライブラリ。

日付を UTC で出力し、クライアント側のライブラリで日付を再フォーマットすることもできますが、サーバー側のソリューションを使用することをお勧めします。

これに対する良い解決策、またはNode.JSアプリのこのギャップを埋めるライブラリを知っている人はいますか? これに対する確立されたベストプラクティスはありますか?

4

2 に答える 2

6

node-timeライブラリとmoment.jsライブラリの両方を使用して、これに対する比較的洗練されたソリューションを作成する方法を考え出すことになりました。

次のようなモジュールmoment_tz.jsを作成しました。

var moment = require('moment'),
    time = require('time');

exports = module.exports = function(t,z) {
    var tz = new time.Date(0, z);
    return moment(t).add('minutes', t.getTimezoneOffset() - tz.getTimezoneOffset());
}

moment2 つのタイムゾーンの差 (分単位) で更新されたオブジェクトを返します。

これを使用してシドニーの現在の時刻を出力する方法は次のとおりです。

moment_tz(new Date(), 'Australia/Sydney').format('Do MMM \'YY - h:mm:ss a')

誰かがより良い解決策を持っている場合は、私に知らせてください!

乾杯。

于 2013-01-09T15:33:52.820 に答える
2

私はそれが古い投稿であることを知っていますが、これは MomentJs が現在タイムゾーン機能を持っている人を助けるかもしれません。

http://momentjs.com/timezone/

var time = moment.tz(new Date(), timezone_string) /* timezone_string = "Australia/Sydney" */
var timestring = time.format('D/MM/YYYY hh:mm A')

お役に立てれば。

于 2015-05-16T07:35:44.270 に答える