2017-04-25 11 views
2

momentjsのドキュメントといくつかの問題(ここではstackoverflow)ローカルのUTCオフセットがどのように決定されているかの答えが見つかりませんでした。私はアメリカ/デンバータイムゾーンにいます。この執筆時点では、オフセットはUTC-07:00です。 Windowsの時計が正しく設定され、ローカル時刻が正しく表示されます。 「2017年4月24日午後五時33分55秒」のUTCタイムスタンプのために、私は「4月24日午前10時12分34秒」モーメントjsが間違ったタイムゾーン/オフセットを取得していますので、UTCから現地時間への変換は正しくありません

dateString = "2017-04-24 17:12:34" 
console.log("dateString: " + dateString) 
utc = moment.utc(dateString) 
console.log("utc: " + utc.format()) 
now = moment(utc.format()) 
console.log("now: " + now.format()) 
displayDate = now.format("MM/DD HH:mm:ss") 
console.log("displayDate: " + displayDate) 

しかし、これは何であるとしてdisplayDateをログに記録するために、次のコードを期待しますコンソールが表示さ:00:

dateString: 2017-04-24 17:12:34 
utc: 2017-04-24T17:12:34Z 
now: 2017-04-24T18:12:34+01:00 
displayDate: 04/24 18:12:34 

私はそれはUTC + 01のオフセットで私はタイムゾーンにいると考えてどのようには考えています。私は瞬間タイムゾーンを使用していないし、なぜ瞬間が間違ったオフセットを拾っているのかを解決することができませんでした。私はTZ環境変数がAmerica/Denverに設定されていることに気づいたので、これは明らかに効果がありません。どのように瞬間はローカルオフセットを決定するのですか?どこかでうんざりしているデフォルト設定がありますか?同じコードが別のマシンで正常に動作するため、マシン上のものでなければなりません。

このコードは役立つ場合がありますが、AngularJS(バージョン1.5.8)アプリにあります。

乾杯、 リッチ

+1

デンバーは、そのタイムスタンプのためにUTC-6ではありません-7。 '2017-04-24T11:12:34-06:00'を取得する必要があります。これは、説明したように設定されたタイムゾーンでWindows上のChromeで実行したときの結果です。どのブラウザ/バージョンで実行していますか?コマンドラインで 'tzutil/g'を実行できますか? 'Mountain Standard Time'と言うのでなければ、あなたはDenverに設定されていません。 –

+0

また、新しいDate()。toString()と 'new Date()。getTimezoneOffset()を試してください.Momentのローカルタイムゾーンは' Date'オブジェクトからちょうど渡されます。 –

+1

@MattJohnsonコメントをいただきありがとうございます - あなたはデンバーのオフセットについて間違いありません - 私の間違い。私は、DSTが始まった2週間ほど、この方法だと思います。日付とタイムゾーンのオフセットは次のとおりです。[js-time:Tue Apr 25 2017 15:06:10 GMT + 0100(Ame)、js-tz:-60] これはどこから来るのかわかりませんWindowsの時計は、Mountain Time(米国とカナダ)で正しく設定されています。 –

答えて

2

通常のJavaScriptのDate()。のtoString()出力から、それが「アメリカ/デンバー」に設定したとして、それは私にTZ環境変数についての手掛かりを与えました。 TZ環境変数の設定を解除し、Webサーバー(Tomcatサービス)を再起動して再試行しました。私は同じ問題を抱えていましたが、とにかくマシン全体を再起動することに決めました。結局のところ、それはWindowsマシン上の多くの問題に対する解決策です...確かに、それはうまくいった!

結論はJavaScriptがTZ環境変数(システム日付&の時刻設定を上書き)を使用している必要があり、最初の3文字だけを見ているようです。

これは他の人に役立つことを願っています。

+0

*一部の*プログラムは、TZ変数が情報に一致する認識可能なPOSIX文字列またはタイムゾーンIDである場合にのみ、標準Cライブラリの関数を使用する場合など、Windows上の 'TZ'変数を使用します*アプリケーション*は知っています。すべてのOSレベルのタイムゾーン関数が 'TZ'を考慮に入れているので、' TZ'環境変数が常に考慮されるLinuxおよびOSXと対照的です。したがって、一般的に、Windowsの 'TZ'変数に依存しないでください。 –

0

moment.jsを使用している場合は、UTCをローカルタイムゾーンに変換できます。

まず、あなたはそれが変数の日付を定義し、UTCタイムゾーンの日付時刻値を代入すると後moment.jsライブラリに

を追加します

VAR日=「2017年12月25日10:50のように:18 ';

//(UTC日時)

VAR stillUtc = moment.utc(日).toDate();ローカルタイムゾーンに変換

//

VAR局所=モーメント(stillUtc).LOCAL()フォーマット( 'YYYY-MM-DD HH:MM:SS')。

ローカル変数のローカル日付時刻を取得します。ローカル変数を出力し、回答を確認することができます

コンソール。ログ(ローカル)。

あなたのコンソール結果は '2017年12月25日午後04時20分18秒' です

関連する問題