1

JodaTimeライブラリを使用します(私は少し柔軟性がありますが)。月の日が31より上または1より下であるため(クライアント側のコードのため)、入力の一部がJodaの時間を壊していることに気付きました。

LocalDateカレンダーの操作にオブジェクトを使用しています。入力が例外をスローし始めないように、日付を簡単にサニタイズするためのライブラリまたはメソッドはありますか?

私が現在使用しているいくつかのScalaコード:編集:修正されたコード

 val now = new LocalDate();
 val workingDate = now.withYear(y).withMonthOfYear(m).withDayOfMonth(d).withDayOfWeek(DateTimeConstants.SUNDAY)

 ymdStart = toTimestampAtStart( workingDate )

明確にするために、ここでの目標は日付を適切な日付に変換することです。したがって、ユーザーが7月38日を送信すると、8月7日に変換されます。これを多く引き起こす着信URL構造があり、のように見え/timeline/2012/07/30ます。

純粋な運動の理由で(正規化は悪い習慣のように思われることに同意します)、そのような問題を扱うライブラリがあるかどうか、私は今、純粋に興味があります。

ありがとう!

最終更新:

答えが指摘しているように、正規化は悪い考えでした。入ってくる変数を修正するために、クライアント側で多くのリファクタリングを行いました。これは私が使用することになったコードです:

ymdStart = new Timestamp( toTimestampAtStart( new LocalDate(y,m,d).withDayOfWeek(1) ).getTime - 86400000 )
ymdEnd = new Timestamp( ymdStart.getTime + 691200000 )
4

1 に答える 1

3

まず、LocalDateは不変であるため、チェーンされるたびwith...()に新しい日付が作成されます。

次に、日付の一部を一度に1つずつ更新することはよく知られているアンチパターンです。最終結果は、日付の現在の値、ピースを更新する順序、および実装が日付を「正規化」するかどうかによって異なります。

言い換えれば、日付/時刻を少しずつ更新しないでください

実装が無効な日付を「正規化」(つまり、オーバーフローを修正)すると1分間仮定します。あなたのコードを考えると、今日の日付が2011年1月31日で、

now.setMonth(FEBRUARY);
now.setDayOfMonth(12);

結果は2011年3月12日になります。最初のステートメントは、日付を3月3日に正規化される2月31日に設定し、次に日を12に設定します。つまり、最初に日を設定するだけです。しかし、それはさまざまな開始点では機能しません(その構築は演習として残されています)。

そして、あなたの質問から、JodaTimeは正規化するのではなく例外をスローするのではないかと推測します。これが、この方法でそれを行わない理由の1つです。

于 2012-07-31T02:58:02.747 に答える