Moment: Date.prototype.toString()からタイムゾーンの省略形が見つかりません

作成日 2012å¹´02月06日  Â·  33コメント  Â·  ソース: moment/moment

こんにちは私はフォーラムを介してmoment.jsサイトに出くわし、ユニットテストに出くわしたときにそれをクリックしました-これは私がここで報告したい2つのテストに失敗しました:

ユーザーエージェント:
Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 535.7(KHTML、Geckoなど)Chrome / 16.0.912.77 Safari / 535.7 (Chrome 16.0.912.77 m)

タイムゾーン:
UTC + 1

失敗したテスト(#28):
http://pastebin.com/bQsDuxdH

*タイトルはtimrwoodによって編集されました

最も参考になるコメント

愚かな質問:なぜまったく新しいライブラリなのか? 日付と時刻の処理のニーズをすべて解決する瞬間のポイントではありませんか? データファイルは自明ではない量のスペースを追加しますが(そしてそれらを分離することは理解できます)、新しいライブラリ自体は2k未満であるため、スペースがそれを分離する理由ではないようです。

タイムゾーンを含む日付文字列を生成したいだけの人が、Javascriptに組み込まれているはずのことを実行するために、2つの別々のライブラリとデータファイルをダウンロードしなければならないのは悲しいことです。

また、この新しいライブラリの統合を使用して、単純な日付文字列を生成するにはどうすればよいですか? 生成する前に:

Sun, 06 Nov 1994 08:49:37 GMT

と:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

しかし今、私は「z」フォーマットオプションなしでそれをどのように行うべきかについて混乱しています。 どんな助けでもいただければ幸いです。

全てのコメント33件

うーん、タイムゾーンの省略形が失敗しているようです。 リモートデバッグを行って申し訳ありませんが、Chromeでの次の出力は何ですか?

new Date().toString()

また、現在のタイムゾーンの名前は何ですか?

ユニットテストでも同じエラーが発生し、 UTC + 1 (以前はGMT + 1と呼ばれていました)にもいます。

new Date()。toString()は、Firefox10で「SatFeb11 2012 02:15:10 GMT + 0100」、Chromeで「SatFeb 11 2012 02:18:29 GMT + 0100(W。Europe StandardTime)」を出力します。 16およびInternetExplorer9の「SatFeb11 02:18:59 UTC +01002012」

うーん、これが怖かったです。 問題は、 Date.prototype.toStringがそのような異なる結果を返すことです。 タイムゾーン名(PST、CST、ESTなど)を取得できるのはここだけです。 このメソッドがタイムゾーン情報を返さない場合(FF10およびIE9の場合のように、それを取得する方法はありません。

多分それは減価償却する時間ですか? または、ドキュメントに問題を記載するだけでもかまいませんか?

4318が合格、2が失敗しました。 2715ミリ秒。

Mozilla / 5.0(Windows NT 6.1)AppleWebKit / 535.11(KHTML、Geckoなど)Chrome / 17.0.963.56 Safari / 535.11

UTC +2(キエフ、ウクライナ)

フォーマットタイムゾーン2が合格、2が失敗しました。
--->「PST」のようなもの
AssertionError:--->「PST」のようなもの
Object.ok(http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
http://momentjs.com/js/tests.js?_=120203_183019:2413:14
Object.runTest(http://momentjs.com/js/tests.js?_=120203_183019:1702:9)で
http://momentjs.com/js/tests.js?_=120203_183019:1748:25
http://momentjs.com/js/tests.js?_=120203_183019:1006:13
http://momentjs.com/js/tests.js?_=120203_183019:616:13
http://momentjs.com/js/tests.js?_=120203_183019:627:25
http://momentjs.com/js/tests.js?_=120203_183019:1008:17
http://momentjs.com/js/tests.js?_=120203_183019:1589:17
--->「PST」のようなもの
AssertionError:--->「PST」のようなもの
Object.ok(http://momentjs.com/js/tests.js?_=120203_183019:1526:39)
http://momentjs.com/js/tests.js?_=120203_183019:2414:14
Object.runTest(http://momentjs.com/js/tests.js?_=120203_183019:1702:9)で
http://momentjs.com/js/tests.js?_=120203_183019:1748:25
http://momentjs.com/js/tests.js?_=120203_183019:1006:13
http://momentjs.com/js/tests.js?_=120203_183019:616:13
http://momentjs.com/js/tests.js?_=120203_183019:627:25
http://momentjs.com/js/tests.js?_=120203_183019:1008:17
http://momentjs.com/js/tests.js?_=120203_183019:1589:17
+02:00 --->「+ 07:30」のようなもの
+0200 --->「+ 0700」のようなもの

同じ失敗したテスト#28も取得します。私のタイムゾーンはGMT-3です。

エージェント:
Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 535.11(KHTML、Geckoなど)Chrome / 17.0.963.66 Safari / 535.11

失敗したテスト: http :

。:。

エージェント:
Mozilla / 5.0(Windows NT 6.1; WOW64; rv:10.0.2)Gecko / 20100101 Firefox / 10.0.2
または
Mozilla / 5.0(互換性; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4。 0C; Zune 4.7; .NET4.0E)

失敗したテスト: http :

したがって、これはUTC + 1、UTC + 2、およびUTC-3で発生しているように見えます。

残念ながら、これを修正する方法があります。 それはDate().toString()出力をハッキングすることに依存し、その文字列で利用可能なタイムゾーン情報がない場合、その情報を取得する方法はありません。

私はこの機能を減価償却し、おそらくより信頼性の高い(おそらく精度は低くなりますが)結果を持つプラグインを作成します。 おそらくhttps://github.com/mde/timezone-jsのようなものでなければなりません

z zzトークンは、1.6.0で非推奨になりました。 その結果、この問題を解決します。

node.jsはどうですか? z zzはこの環境で信頼できるかどうか?

これらは正式に非推奨になっているため、バージョン1.6.0では機能しません。

それ以前のバージョンのコードでは、NodeがV8を使用し、上記の矛盾する結果の一部がChromeでもV8を使用しているため、結果も矛盾すると思います。

ありがとう。 したがって、 Thu Jan 10 2013 22:54:11 GMT+0100 (CET)ような文字列の場合、最終的に行ったことは、正規表現を使用してタイムゾーン文字列(ここでは(CET)と先頭のスペース)を削除し、タイムシフト情報(ここでは+0100 )のみを残すことです。

うーん、あなたが何をしようとしているのかわかりません。 CETまたは+0100を取得しようとしていますか?

+0100は、 ZZトークン(大文字の使用に注意)を介してサポートされており、解析およびフォーマット時に正常に機能します。

CET Date.toStringから確実に取得できなかったため、 CETは非推奨になりました。 ただし、 +0100にDate.getTimezoneOffsetを使用するため、サポートははるかに一貫性があります。

私はあなたが言うように、+ 0100にZZを使用し、解析する文字列からCETを削除しています。 それは意味がありますか?

申し訳ありませんが、ここで何が問題なのかまだわかりません。 Thu Jan 10 2013 22:54:11 GMT+0100 (CET)を解析しようとしていますか? 次のことができるはずです。

moment('Thu Jan 10 2013 22:54:11 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');

これはまさに私が最後にやっていることです。 あなたは私が正しいことをしていることを確認しているようです。 申し訳ありませんが、はっきりしなかった場合は、回答ありがとうございます。

問題ない!

@ hughanderson4 、問題は、ブラウザが常にDate.prototype.toStringからタイムゾーンの省略形を返すとは限らないこと

それ以来、moment.jsのタイムゾーンサポートを追加するためにmoment-timezoneが作成されました。 あなたはそれがあなたのニーズに合うかどうか見るためにそれを調べたいと思うかもしれません。

moment.utc()を現地時間に変換し、タイムゾーンの省略形を表示するにはどうすればよいですか?

愚かな質問:なぜまったく新しいライブラリなのか? 日付と時刻の処理のニーズをすべて解決する瞬間のポイントではありませんか? データファイルは自明ではない量のスペースを追加しますが(そしてそれらを分離することは理解できます)、新しいライブラリ自体は2k未満であるため、スペースがそれを分離する理由ではないようです。

タイムゾーンを含む日付文字列を生成したいだけの人が、Javascriptに組み込まれているはずのことを実行するために、2つの別々のライブラリとデータファイルをダウンロードしなければならないのは悲しいことです。

また、この新しいライブラリの統合を使用して、単純な日付文字列を生成するにはどうすればよいですか? 生成する前に:

Sun, 06 Nov 1994 08:49:37 GMT

と:

moment().format('ddd, DD MMM YYYY HH:mm:ss z');

しかし今、私は「z」フォーマットオプションなしでそれをどのように行うべきかについて混乱しています。 どんな助けでもいただければ幸いです。

それで、私が理解していることを確認するためだけに尋ねます:非推奨の「z」フォーマットに代わるものはありませんか?

次のようなISO-8601形式のタイムスタンプがある場合:

2014-07-25T18:00:00-04:00

そして、このタイムスタンプを次のように表示したいと思います。

6:00 PM EST

momentはこのフォーマットをサポートしなくなりましたか? すべてのタイムゾーンデータがタイムスタンプに含まれているので、タイムゾーンを変換せずに直接表示したいだけです。

実際にはタイムゾーンは含まれていません。 特にDSTを変更する可能性を検討する場合は、同じUTCオフセットに対応するタイムゾーン名が複数存在する可能性があります。 「UTC-4:00」からタイムゾーンがESTであると推測することはできません。

明確にするために、 zフォーマッターは、特定のゾーンで

今これに言及するだけです-あなたが使用する場合
new Date().toTimeString()
私が試した限り、すべてのブラウザで同じ結果が得られます。

これは、この文字列を使用してタイムゾーンを抽出できる可能性があることを意味します。

こんにちは、上記のformat( 'z')は非推奨です。 また、moment docsでは、1.6.0から非推奨になっていることがわかります。 現在2.11.0を使用していますが、「z」を使用してオフセットに基づいてタイムゾーン(PST / PDT)を表示できます。
今、コードでこの「z」を使用しないでください。 -/ +8の代わりにPSTを表示する正確な代替方法を教えてください

@ themakshter-いいえ、すべてのブラウザで同じ結果が得られるわけではありません。 OS、ブラウザのバージョン、言語はそれに大きく影響します-そして仕様に一貫性の要件はありません。

@ Shobana16 - moment().format('z')を実行すると、常に""が返されます。

moment-timezoneを使用していて、 moment.tz('America/Los_Angeles').format('z')ようなことをすると、有効な応答が得られます。

zはmoment-timezoneで問題ありません。 あっという間に何もしません。

コメントありがとうございますMJ。 ええ、私はモーメントタイムゾーンでのみ「z」を使用しています。 かっこいい、コードは「z」のままになります。 !

追加するメモとして、moment-timezone 0.5.0の時点で、ローカルタイムゾーンで_推測_することができます。これにより、次の扉が開かれます。

var abbreviation = moment.tz(moment.tz.guess()).format('z');

これは問題ありませんが、次の点に注意してください。

  1. それは単なる推測です。 推測が間違っているかもしれません。
  2. 推測が間違っている場合でも、 Europe/ParisとEurope/Berlin両方がCET使用する方法など、多くの同様のタイムゾーンで同じ略語が使用されるため、略語が正しい可能性があります。 CEST 。
  3. ただし、保証はありません。 推測が間違っている場合は、間違った略語を提示している可能性があります。

また、moment.jsを適応させて、moment-timezoneが利用可能な場合に、これを自動的に実行してzフォーマッターを再度有効にすることを検討することもできます。 これは現在起こっていませんが。

var abbreviation = moment.tz(moment.tz.guess()).format('zz');が機能していないようです(2つのzがあります)。 「EDT」のみを取得でき、「EasternDaylightTime」は取得できませんか?

ありがとう!

ああ、 http: //momentjs.com/timezone/docs/#/using -timezones / formatting /に次のように書かれていることがわかりましたmoment.fn.zoneNameを上書きして、 zzを使用できます。
[and much more...]
ありがとう。

ただし、混乱を招くことが1つあります。 現在のバージョン(または「 1.6.0以降」と記載されている)では、個別のmoment-timezoneを使用せずにタイムゾーンを表示する方法はありません。 しかし、 moment(...).toString()すると、たとえばGMTが最後に表示されます。 それで、それはバグですか、それともある解決策が別の機能と矛盾しますか?

ただし、混乱を招くことが1つあります。 現在のバージョン(または「 1.6.0以降」と記載されている)では、個別のmoment-timezoneを使用せずにタイムゾーンを表示する方法はありません。 しかし、 moment(...).toString()すると、たとえばGMTが最後に表示されます。 それで、それはバグですか、それともある解決策が別の機能と矛盾しますか?

問題は信頼性だと思います。 Momentは、ローカルの日付オブジェクトから正しいタイムゾーンを確実に抽出できないため、フォーマットでz/zzをサポートしなくなりました。

上で議論された:
https://github.com/moment/moment/issues/162#issuecomment -4060027

zが非推奨になったため、これが「GMT」テキストを取得するために機能したものです。

const dateGenerated = moment("2020-05-20 08:15:25");
const localDateGenerated = dateGenerated.local().format('DD MMM YYYY hh:mm A') + ' ' + String(dateGenerated.local()._d).split(' ')[5];

20 May 2020 08:15 AM GMT+0300"を生成します

このページは役に立ちましたか?
0 / 5 - 0 評価