Moment: バックエンドのタイムゾーンを維持することは可能ですか?

作成日 2018年10月04日  ·  3コメント  ·  ソース: moment/moment

問題の説明と再現手順:
バックエンドから次の形式で日付を受け取ったとします。

"2018-10-10T13:00:00+11:00"

解析とフォーマットの後にフロントエンドに表示されると予想されるもの:

10-10-2018 1.00 PM

私が得たもの:

10-10-2018 5.00 AM

システムのタイムゾーンが何であるかは関係ありません。 UTC時間も見たくありません。 どうすればそれを達成できますか?

使用するすべての変数の値を含めてください。

上記を参照。

環境:

それは問題ではありません、それは環境に依存するべきではありません。 それが問題です、ところで、それは依存するからです!

最も参考になるコメント

parseZoneを試すことができます:

たとえば、BST(UTC + 1)のロケールタイムゾーンの場合

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"

全てのコメント3件

Afaik、momentはデフォルトで、日付をフォーマットするときにデバイスのタイムゾーンを使用します(これはJavascriptの標準的な動作でもあります)。 そうです、日付のフォーマットは環境に依存するはずです。 たとえば、私のデバイスでは、これをあなたの日付で取得します。これは、私の現地時間(オークランド)の正しい時刻です。

moment("2018-10-10T13:00:00+11:00").format()
// => '2018-10-10T15:00:00+13:00'

ユーザーのデフォルトのタイムゾーンを手動で設定する場合は、 IANAタイムゾーン名でmoment-timezoneを使用できます。

moment.tz.setDefault('America/New_York');

これにより、すべてのフォーマットがそのタイムゾーンで実行され、環境に依存しなくなります。

ドキュメントへのリンクは次のとおりです: https ://momentjs.com/timezone/docs/#/using -timezones / default-timezone /


オフセットからユーザーのタイムゾーンを見つけることはできませんが(たとえば、夏時間に応じて、複数のタイムゾーンが同じオフセットを共有できるため)、「一般的な」ゾーンにEtc/GMT-11 Etcゾーン名を使用できます。あなたの場合Etc/GMT-11 (これらのゾーンでは符号が逆になっています)。 あなたの場合、ユーザーのタイムゾーンを設定として保存してサーバーに保持するか、タイムスタンプと一緒に保存する方がおそらく理にかなっています。

次に、たとえばを使用して、特定のタイムゾーンの単一の日付を印刷できます。

moment.tz("2018-10-10T13:00:00+11:00", "America/New_York");

ありがとう、 @ simonhaenisch

tzプラグインを見たことがありますが、ある時間帯から別の時間帯への変換など、タイムゾーンの管理に役立つと思いました。 そして、タイムゾーンにまったく触れないためだけにそれを使用することは私には奇妙に聞こえます:)

ユーザーのデフォルトのタイムゾーンを手動で設定する場合

残念ながら、サーバーにはdefaultのタイムゾーンはありません。 各ユーザーには独自のタイムゾーンがあり、プロファイルに保存されます。 そしてフロントエンドはそれについて何も知りません。

オフセットからユーザーのタイムゾーンを見つけることはできません

それは大丈夫です、私はタイムゾーンを気にしません。 必要なのは、変更せずに次の日付を保持することだけです。

ユーザーのタイムゾーンを設定として保存してサーバーに保持するか、タイムスタンプと一緒に保存します。

これがまさに起こっていることです。 タイムゾーンは設定であり、タイムスタンプとして保存された日付です。

バックエンドAPIは私の管理下にあるので、タイムゾーンオフセットなしで日付の縮小バージョンを送信することができます。 お役に立てば幸いです。

しかし、moment.jsにそのようなものがない理由は本当に興味深いです:

moment(somDateTime).format({ formatWithDeviceTimezone: true })

または一種の:)

formatWithDeviceTimezoneはデフォルトでfalseです。

とにかく、ありがとう、今私は問題を見ます。

parseZoneを試すことができます:

たとえば、BST(UTC + 1)のロケールタイムゾーンの場合

moment.parseZone("2018-10-10T13:00:00+11:00").format(); // "2018-10-10T13:00:00+11:00"
moment.parseZone("2018-10-10T13:00:00+11:00").local().format(); // "2018-10-10T03:00:00+01:00"
moment.parseZone("2018-10-10T13:00:00+11:00").utc().format(); // "2018-10-10T02:00:00Z"
このページは役に立ちましたか?
0 / 5 - 0 評価