web-dev-qa-db-ja.com

moment()。utcOffset()による時間オフセットの更新

タイムオフセットを処理するためにmoment.jsを使用しようとする問題に直面しています。

非表示の入力でローカルユーザーの時間オフセットを収集します。

<script type="text/javascript">
  $(document).ready(function () { 
    $('input#timeoffset').val(moment().utcOffset()); 
  });
</script>

オフセットは正しく保存されます(私の場合、その値は-240です)。後でサーバー側(utc時間で実行されます)で、dbに格納されたutcDateのような更新を試みます。

var userDate = moment(utcDate).utcOffset(offset)

私の問題は次のとおりです。上記のようにコードを実行しても効果はありません。

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 012421 +0000

オフセット記号を反転すると、次のようになります:

  • utcDate: 20151001 012421 +0000
  • userDate: 20151001 052421 +0400

私は明らかに何か間違ったことをしています(最初のバージョンが正しいと思っていたとしても)、何かヒントはありますか?

クライアント側では、moment.js v2.10.6を使用していますが、サーバー側では、moment-timezone.js v0.4.0およびmoment.js v2.10.6を使用しています。

16
Pierluigi

主な問題は、オフセットを数値ではなく文字列として渡すことです。

_moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ')
// "20151001 012421 +0000"

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
_

分単位のオフセットがある場合は、数値形式を使用する必要があります。いつでも変換できます:

_moment.utc("2015-10-01 01:24:21").utcOffset(+"-240").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
_

Momentはオフセットを文字列として渡すことを許可していますが、ISO8601形式のいずれかであると想定しています:_[+/-]HH:mm_または_[+/-]HHmm_。

_moment.utc("2015-10-01 01:24:21").utcOffset("-04:00").format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"
_

さらに、moment.utc(...)を使用して入力文字列を解析したことに注意してください。タイムゾーンが明示的でない場合、または文字列ではなくDateオブジェクトを渡す場合を除き、localタイムゾーンを使用するmoment(...)を使用しました。また、momentオブジェクトは「ローカルモード」のままになるため、マシンのタイムゾーンが実際にUTCに設定されていない限り、utcDate出力は間違っています。

最後に、「タイムゾーン!=オフセット」を忘れないでください。取得したオフセットがすべての日付に対して有効であるとは想定できません。ユーザーのタイムゾーンに日付を投影する必要がある場合は、_America/New_York_などのタイムゾーンを実際に知る必要があります。これらはmoment-timezoneプラグインで使用できます。

23