私は最も安全で最も複雑でない方法は、データベース内に存在する可能性のあるすべての日付の計算を再度実行します。それから彼らは何を得ているのかを知っているので、あなたはその日が何であったのかに戻ることができます。間違った日付(Date
またはString
など)から地図にマップして、それがあったはずだった場所にマップします。私は
import java.sql.Date;
を使用しています
私もjava.time
からLocalDate
とMonth
を使用しています - これらは、Java 7を使用している場合は、代わりにjava.util.Calendar
を使用できるJava 8を必要としています。コードの例 - ニーズに合わせて調整する:選択した日付の
DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Map<Date, Date> corrections = new HashMap<>(5500); // capacity for 11 years
LocalDate endDate = LocalDate.of(2020, Month.DECEMBER, 31);
LocalDate currentDate = LocalDate.of(2010, Month.JANUARY, 1);
do {
Date correctDate = Date.valueOf(currentDate);
String correctString = correctDate.toString();
Date wrongDate = new Date(dateFormat.parse(correctString).getTime());
if (corrections.containsKey(wrongDate)) {
System.out.println("Duplicate wrong date " + wrongDate);
}
corrections.put(wrongDate, correctDate);
currentDate = currentDate.plusDays(1);
} while (! currentDate.isAfter(endDate));
、2010年から2020年までの間隔内で、我々は戻って変換することができますので、上記のコードを実行すると、印刷しようとするDuplicate wrong date
ラインをはありません明白に。安堵ですね。
今あなたがマップを構築している、ルックアップは例えば、簡単です:
Date wrongDate = new Date(dateFormat.parse("2017-10-20").getTime()); // 0026-04-09
Date correctDate = corrections.get(wrongDate);
if (correctDate == null) {
System.out.println("Could not find correction for " + wrongDate);
} else {
System.out.println(correctDate);
}
これは印刷したい:
2017-10-20
あなたがわから取得しないようにしたいでしょうnull
を入力してから、データベースに値を戻してください。
最新のJDBCドライバを使用している場合は、上記のコードでjava.sql.Date
を避けて、最新のLocalDate
と友だちをすべて使用する必要があります。
代わりに日付形式を 'yyyy-MM-dd'に切り替えるのはなぜですか? –
は0026-04-09の日付でそれを試しました、それはまた、また04-04-09を与えます、問題は私が他の日付のために記録したものを逆転しようとしていることです – CriminalDuck
あなたは '0026-04-09'を持っていますあなたのデータベースは今、 '2017-10-20'に戻したいのですか?それは文字列または日付として格納されていますか?私は防弾方法があるかどうかはわかりませんが、いくつかの情報があればわかりやすく伝えることができます。 –