Oto nowoczesny odpowiedź. Inne odpowiedzi to dobre odpowiedzi, gdy zostały napisane w 2013 roku. Rok później pojawił się nowoczesny interfejs API daty i czasu, zastępujący stare klasy: Date
, SimpleDateFormat
i znajomych. IMHO powinieneś teraz korzystać z nowych klas. Są znacznie bardziej przyjazne programistom.
LocalDateTime newDate = null;
String dateTime = "2013-03-18 08:30";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH);
try {
newDate = LocalDateTime.parse(dateTime, dtf);
} catch (DateTimeParseException e) {
throw new InvalidInputException("Invalid date input.");
}
Oprócz nazw klas nie różni się tak bardzo od starego kodu. W innych przypadkach będą różnice, zazwyczaj nowoczesne klasy zapewnią bardziej przejrzysty kod i mniej możliwości popełnienia błędów.
Dla jednego małego demonstracji różnicy, spróbujmy ciąg formatu wzór trzeba było z wielkimi literami YYYY
w nim:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH);
Teraz kod rzuca java.time.format.DateTimeParseException: Text '2013-03-18 08:30' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=3, DayOfMonth=18, WeekBasedYear[WeekFields[SUNDAY,1]]=2013},ISO resolved to 08:30 of type java.time.format.Parsed
. To długo, wiem. Należy zauważyć, że nie ma roku wśród pól, o których wspomina, tylko Tydzień. To nie to samo; a może już wiesz, że to jest dokładnie dlatego, że wielkie litery Y
są dla roku opartego na tygodniu (tylko użyteczne z numerem tygodnia), gdzie powinieneś używać małej litery y
na rok. Uważam, że to zachowanie jest nieco bardziej pomocne niż to, co zrobiły stare klasy: dały ci wynik, który był błędny, udawałeś, że wszystko było w porządku i zostawiłeś cię całkowicie w ciemności na temat tego, co było nie tak.
Następna Rozumiem, że chcesz przechowywać datę i godzinę w bazie danych. W dawnych czasach chciałbyś przekonwertować na odpowiedni typ java.sql
. Nie jest już konieczne. Wierzę, że za pomocą sterownika JDBC 4.2 można po prostu wykonać:
ps.setObject(3, newDate);
Nie testowałem tego z bazą danych. Zauważ, że używasz setObject()
zamiast setDate()
.
Dla aktualizacji, 'java.sql.Date' jest tylko dla daty, przeznaczone dla dat typu danych SQL. Z dokumentacji: "Aby zachować zgodność z definicją SQL DATE, wartości milisekund owinięte przez instancję java.sql.Date muszą być" znormalizowane ", ustawiając godziny, minuty, sekundy i milisekundy na zero w danej strefie czasowej za pomocą z którym powiązana jest instancja. " –