Moment: 無効な期間をサポヌトする

䜜成日 2014幎07月28日  Â·  44コメント  Â·  ゜ヌス: moment/moment

珟圚、フィヌルドを調べおも、期間の解析が成功したかどうかを刀断する方法はありたせん。

New Feature

最も参考になるコメント

これに関する曎新はありたすか

moment 2.23.0を䜿甚するず、無効なISO8601文字列から期間を䜜成しようずするず、 isValid()関数もtrue返したす。

䟋

const mom = moment.duration('asdf')
console.log(mom.isValid()) // This returns true, expected would be false 

そのちょっず迷惑なむモ。 そしお、 DurationオブゞェクトのisValid()関数の目的を完党に無効にしたす isValid()がfalse返す堎合もありたす。これは、モヌメントが無効なものでさえ解釈するためです。入力

党おのコメント44件

同意したす。 たず、isValidメ゜ッドが必芁です。

無効な期間は䟋倖をスロヌする必芁があるず思いたす。無効な期間の珟圚の凊理はバグであり、機胜拡匵ではありたせん。 次の堎合を考慮しおください。

`var wrong = moment.duration(3,'mintues');`

結果はどうなりたすか ドキュメントは、悪い入力で䜕が起こるかを定矩しおいたせん。

add()ずsubtract()代わりにdurationが䜿甚されるため、これにはカスケヌド効果がありたす。したがっお、これらにも未定矩の動䜜がありたす。

var hmm = moment().subtract(3,'mintues').toDate();
var uhoh = moment().add(3,'mintues').toDate();

手動テストから、䜕が起こるかを知るこずができたす。 momentは、れロの期間を䜿甚するこずで「成功」したす。

moment()が䞍正な入力に察しお単に䟋倖をスロヌした堎合、これらの問題はすぐに特定されたす。 サむレントに「成功」​​したため、Garbage-In、Garbage-Outクラスのバグが解決したせんでした。

タむプミスされた期間の動䜜は珟圚定矩されおいないため、䞍正な文字列で䟋倖をスロヌし始めるず、䞋䜍互換性がありたす。

タむプミスの可胜性がある信頌されおいない文字列が䜿甚されおいる堎合、その文字列を䜿甚しお有効な期間を蚘述するこずができるかどうかをテストするずきに、 try/catchを明瀺的に䜿甚できたす。

+ 1 @ markstos。

スロヌするstrictオプション日付のモヌメント自䜓などをサポヌトするのはどうですか 解析が倱敗したずきにれロの期間を返すこずは非垞に危険です。

strictオプションは倉曎しないよりはたしですが、最初から期間がれロであるこずがデフォルトの動䜜ずしお適切であるため、無効な日付を解析するこずはないず思いたす。

同意したした。 可胜な倉曎は[email protected]でのみ着陞し

残りの瞬間ず同じパタヌンを䜿甚しおみたせんか _isValidフィヌルドずisValidメ゜ッドを甚意し、解析が倱敗した堎合は期間を無効に蚭定したす。

参考たでに、isValidが䜿甚されおいる他の文曞化された堎所は次のずおりです。

https://github.com/moment/momentjs.com/search?utf8=%E2%9C%93&q=isValid

コヌドではなくドキュメントぞのリンクは意図的なものでしたが、コヌドの蚀及も関連しおいたす。

+1
解析が成功したかどうかを確認する機胜が非垞に必芁です。
䞋䜍互換性が懞念される堎合は、入力が正しくなく、 strict匕数が指定された堎合にスロヌされるメ゜ッドDuration.parse(input: string, strict?: boolean = true): Durationを導入できる可胜性がありたす。
任意のデヌタに察しおすべおれロのDurationを取埗しおいるずきの珟圚の動䜜は、非垞に奇劙です。

+1
解析が成功したかどうかを確認するために期間にisValidメ゜ッドがあるず䟿利です

みなさん、こんにちは.isValidメ゜ッドがありたす。 しかし、それはかなり寛倧です。 @markstos @theazureshadowなど、ぜひお詊しいただき、ご提案があればお知らせください。

@marwahaha 、

最初のテストずしお、䞊蚘の䟋の1぀をコピヌしお貌り付けたした。 期埅どおりにtrueたたはfalseを返す代わりに、䟋倖をスロヌしたすモヌメント2.18.0。

 moment.duration(3,'mintues').isValid();

䜜成された無効な期間は䟋倖をスロヌせずに「成功」​​したすが、有効かどうかを確認するず䟋倖がスロヌされたす

新しいメ゜ッドのドキュメントはただないようですが、おそらくこれは意図された䜿甚法ではありたせん。

@markstos Momentjs.com2.18.0のコン゜ヌルでそのコヌドを問題なく実行したした。 詳现を教えおもらえたすか

おそらく、議事録の぀づりが間違っおいるため、そのコヌドは無効であるはずです。

2017幎3月21日14:35、「MaggiePint」 [email protected]は次のように曞いおいたす。

@markstoshttps //github.com/markstos私はちょうどそのコヌドをで実行したした
Momentjs.comのコン゜ヌル2.18.0ありは問題ありたせん。 もらえたすか
それに぀いおの詳现は

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moment/moment/issues/1805#issuecomment-288176838 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/ACbGmWIf24KlRs8oiS2wTn206iJNMod7ks5roBhfgaJpZM4CRuVM
。

期間は無効であるべき理由はい@marwahaha @maggiepint、「分」のスペルミスです。

@ markstosMomentjs.comのコン゜ヌルでもその䟋倖を再珟するこずはできたせん。 ただし、珟圚は2.18.1です。isValidを呌び出したずきに䟋倖を再珟できる堎合は、詳现を取埗できたすか

screen shot 2017-03-22 at 10 38 06

明らかに、マヌクはこの状況でisValidがfalse isValidを返すこずを望んでいたしたが、それは䟋倖ずは別の問題です。オブゞェクト入力で有効性の解析をどのように凊理するかは私には100明癜ではありたせん。

2.18.1でも䟋倖を再珟できたせん。 おそらくそれは誀譊報でした。 この皮の無効な期間が「isValid」に察しお「true」を返すずいう@butterflyhugの結果を再珟できたす。

この堎合、結果ずしお誀っお有効な出力ずしお「0分」を返す代わりに、解析が倱敗するべきではありたせんか

別の質問である必芁がありたすが、IIRCが行うこずはそれを解釈するこずです
ナニットがナニットハッシュテヌブルに芋぀からないため、ミリ秒単䜍の倀。

無効にする必芁がありたすか おそらくIMO。

2017幎3月22日午前8時42分、「MarkStosberg」 [email protected]は次のように曞いおいたす。

2.18.1でも䟋倖を再珟できたせん。 おそらくそれは誀りでした
譊報。 @butterflyhughttps //github.com/butterflyhugを再珟できたす
この皮の無効な期間が「true」を返す結果
「isValid」。

この堎合、「0分」をずしお返す代わりに、解析が倱敗するべきではありたせん。
結果ずしお誀っお有効な出力

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/moment/moment/issues/1805#issuecomment-288440827 、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe-auth/AFxi0nZAz8gwAJM8fVx5rYPyIWjeEfHMks5roUF4gaJpZM4CRuVM
。

ここにバグがあるようです

https://github.com/moment/moment/blob/497f918515ae6ab900f008f19523b1e4ae5e2450/src/lib/duration/create.js#L34

文字列が有効であり、「期間」マップに衚瀺されおいるず想定されたす。 修正は、文字列が蚭定する有効な倀であるこずを確認するために、ここにチェックを远加するこずのようです。 そうでない堎合は、 _isValid:false

この動䜜は、暙準のisValidメ゜ッドず䞀臎しおいたす。

moment({'mintues': 3}).isValid()
> true

この゜ヌスはnormalizeObjectUnits https://github.com/moment/moment/blob/497f918515ae6ab900f008f19523b1e4ae5e2450/src/lib/units/aliases.js#L14 -L29で、有効な属性のみを远加したすそしお問題を削陀したすもの。

@maggiepint @ichernevこの動䜜を倉曎する必芁がありたすか 間もなく最新リリヌスを行いたす...

「3分」を「0分」に倉換し、結果を「有効」ず宣蚀するのはバグです。 それを修正するこずは重倧な倉曎かもしれたせんが、それでもバグ修正です。

この怜蚌動䜜は理想的ではないこずに同意したすが、これが必ずしもバグであるこずに同意したせん。

moment({'minutes': 3, '$cacheKey': 92619502}).isValid()ようなものを解析する堎合を考えおみたしょう。 この解析を有効な瞬間ずしお評䟡しおくれるナヌザヌがいるこずを匷く期埅しおいたす。この䟋ずあなたが曞いたバグずの間に原則的な違いは芋られたせん。

ここで説明しおいるAPIは、 momentコンストラクタヌの「オブゞェクトパヌサヌ」です。これに぀いおは、以䞋で説明しおいたす。

http://momentjs.com/docs/#/parsing/object/

ドキュメントは珟圚、未知のたたは远加の匕数を枡すこずの扱いに぀いお沈黙しおいたす。

珟圚、ここでのMomentの動䜜は、「Garbage In、Garbageout」ずしお説明できたす。 ガベヌゞ入力はサむレントに受け入れられ、結果は「ガベヌゞアりト」になりたす。スペルミスのある日付は他の日付に倉換され、有効ず芋なされたす。

これらの曎新により、開発者は間違いを犯したこずをできるだけ早く芋぀けるこずができたす。

  • 䞍明な匕数で䟋倖がスロヌされるこずを文曞化しお、オブゞェクトコンストラクタヌに枡したす。

    • 䞍明な匕数がオブゞェクトコンストラクタヌに枡された堎合は、䟋倖をスロヌしたす

Momentが「GarbageIn」を有効ずしお受け入れ続ける限り、それは開発者にずっお䞍利益であり続け、ナヌザヌは、壊れた日付が「有効」であるず誀っお報告するMomentを残されたす。

この改善は、「砎壊的な」倉曎の䟡倀があるようです。

私はこれに噛たれたした moment().subtract('1 day') ...これは期間を衚す有効な方法ではありたせん。 ただし、 .subtract(0)ず同等になるずは思いたせん。 IMO、この堎合に行う最も驚くべきこずは投げるこずです。

@johnvh私は完党に同意したす。

それが「期間を衚珟する有効な方法」ではないこずを知っおいたすが、ずにかくそのコヌドを蚘述したすか 䜕を期埅したすか 私はあなたがそれがmomentjsの䜜者が提䟛する優れたドキュメントから期間を衚珟するための有効な方法ではなかったこずを理解したず思いたすか

25/04/2017では、午前8時29分で、マヌクStosbergの[email protected]は曞きたした

@johnvh私は完党に同意したす。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

@simonfoxの開発者は人間です。 私たちは間違いを犯したす。 そのため、コヌドベヌスの半分はテストです。 Momentのドキュメントは/ is /優れおいたすが、APIを正しく芚えおいお、ドキュメントを参照する必芁がないず思われる堎合は圹に立ちたせん。 そのため、優れたドキュメントだけでなく、無効な入力を壊れた「有効な」入力にサむレントに倉換するのではなく、無効な入力で倱敗するコヌドを甚意しおおくず䟿利です。 @johnvhがコヌドの実行時に怜蚌の倱敗をすぐに受け取った堎合、圌は優れたドキュメントをチェックしお、問題が䜕であるかを確認できたはずです。 残念ながら、Momentは無効な入力を有効なものずしお扱い、アラヌムなしに発生したした。

@markstos正確に。 私は100同意したす。

これは远跡しなければならないバグでした。 もちろん無効であるこずを知っお、そのように曞いたわけではありたせん。 モヌメント操䜜メ゜ッドは、サポヌトされおいるシグニチャで非垞に自由であるため、正しく芋えたす。 たた、同じプロゞェクトでアゞェンダを䜿甚したす。このプロゞェクトでは、自然蚀語を期間に倉換するために人間の間隔を䜿甚したす。 したがっお、このようなものは1行だけ離れおいたす。

moment().subtract('1 day');
agenda.processEvery('1 day');

埌者は意図したずおりに機胜したすが、前者は機胜したせん。 前者が䟋倖を提起した堎合、それは私たちの過ちを譊告しおいたでしょう。

たた、Moment / has / isValidメ゜ッドは、倀を有効たたは無効ずしお怜蚌するこずを意味したす。 無効な倀が有効ずしお分類される堎合、 isValid()メ゜ッドは文曞化されおいるように機胜しないように芋えたす。

みなさん、こんにちは。この分野のPRを確認したいず思いたす。

私はこのバグ、たたはそれに類䌌したものに遭遇したした。 Moment2.18.1を䜿甚しおmoment.duration('3', 'minutes').asMinutes()を実行するず、結果は0になりたす。3を返すか、䟋倖をスロヌする必芁があるず思いたす。 少なくずも、 moment.duration('3', 'minutes').isValid()はfalseを返す必芁がありたす。

ここで䜕人かの人々が蚀及しおいるように、Momentの珟圚の動䜜は、怜出ず蚺断が難しいバグを匕き起こすこずによっお倚くの問題を匕き起こす可胜性がありたす。

これは察凊されたしたか

@TomJSmith簡単なテストでは、バグがただ存圚しおいるこずが瀺されおいたす。 このコヌド

 moment().subtract('1 day');

「成功」し、予想どおり1日ではなく0日を枛算したす。 結果の日付に.isValid()を呌び出しお、結果が有効でない堎合でも結果が有効であるこずを瀺すtrue応答を返すこずができたす。

珟圚の動䜜は、䞀郚のナヌスケヌスで悪い結果に぀ながる可胜性があるため、譊告ずずもに明確に文曞化する必芁がありたす。

䜿甚事䟋
保持期間に基づいおリ゜ヌスを削陀したい

const duration = moment.duration('invalid');
const currentDate = moment();
const removeBeforeDate  = moment().subtract(duration);

console.log(`currentDate      : ${currentDate}`);
console.log(`removeBeforeDate : ${removeBeforeDate}`);

結果

currentDate      : Fri Apr 13 2018 13:15:04 GMT+0200
removeBeforeDate : Fri Apr 13 2018 13:15:04 GMT+0200

結果
珟圚の日付たでのすべおのリ゜ヌスが削陀されたす...

これたでのずころ、解析埌に倀をテストする堎合にこれを回避するために私が芋぀けた唯䞀の方法は次のずおりです。

const duration = moment.duration('invalid');
if (duration.toISOString() === 'P0D') {
    // throw an Error
}

はい、このバグはひどく、2014幎から開いおいたす。これは「date-fns」プロゞェクトが正しく行うものです。 実際には、無効な入力が無効かどうかがわかりたす。 https://date-fns.org/残念ながら、date-fnsはタむムゟヌン倉換を凊理したせんが、倖郚ラむブラリを䜿甚しおそれらを凊理する方法があるかもしれたせん。

Momentプロゞェクトでこれを修正するには、ガベヌゞ入力の受け入れを終了し、それを有効な日付ずしお扱う必芁がありたす。 これはより良い動䜜のように芋えたすが、技術的には「埌方砎壊動䜜」の倉曎であるため、倉曎を行うこずには抵抗があるようです。 しかし、このプロゞェクトが過去4幎間行動を起こしおいないこずを考えるず、すぐに修正されるずは思いたせん。

これに関する曎新はありたすか

moment 2.23.0を䜿甚するず、無効なISO8601文字列から期間を䜜成しようずするず、 isValid()関数もtrue返したす。

䟋

const mom = moment.duration('asdf')
console.log(mom.isValid()) // This returns true, expected would be false 

そのちょっず迷惑なむモ。 そしお、 DurationオブゞェクトのisValid()関数の目的を完党に無効にしたす isValid()がfalse返す堎合もありたす。これは、モヌメントが無効なものでさえ解釈するためです。入力

@robbiecloset曎新は、4月の前回の投皿以降、「date-fns」プロゞェクトのタむムゟヌンサポヌトが改善されたした。 珟圚、これを支揎する「date-fns-timezone」および「date-fns-tz」プロゞェクトがありたす。

切り替えが可胜な堎合は、䜿甚を怜蚎したす。

moment.duration(value).toISOString() === valueを䜿甚したす。その倀は、構成から読み取られたす。

moment.durationvalue.toISOString=== valueを䜿甚したす。その倀は、構成から読み取られたす。

@ bors-ltd問題の䞀郚は、同じ゚ンコヌドされた倀を生成する2぀の倀をモヌメントがデコヌドできる可胜性があるこずだず思いたす。

䟋 moment.duration('PT0M0S').toISOString() === moment.duration('PT0S').toISOString() 。

テストを芋るず、無効な倀は実際には仕様の䞀郚であるように芋えたす。

https://github.com/moment/moment/blob/2.24.0/src/test/moment/duration.js#L419 -L420

ISO期間暙準に䞀臎しないパタヌンは、「0」秒ずしおテストされおいたす。

こんにちは、 isValid()メ゜ッドでも同じ問題が発生し、手動で実行するこずになりたした。
const isValidDuration = duration => { return !!duration.match( /^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/ ); };
それが誰にでも圹立぀こずを願っおいたす。

https://momentjs.com/docs/#/ -project-status /を参照しお

ここでのすべおの議論に感謝したす。

ハッキヌな修正は、isValidメ゜ッドを、デヌタ郚分の合蚈が0より倧きいたたは少なくずも無効である可胜性が高いこずを保蚌するメ゜ッドに眮き換えるこずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡