2013-04-10 34 views
6

Próbuję przeanalizować kod String (YYYY-MM-dd HH:mm) do Date, jednak otrzymuję niepoprawną datę niż oczekiwano.SimpleDateFormat generuje niepoprawny czas daty podczas analizowania "RRRR-MM-dd GG: mm"

KOD:

Date newDate = null; 
String dateTime = "2013-03-18 08:30"; 
SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm", Locale.ENGLISH); 
df.setLenient(false); 
try { 
    newDate = df.parse(dateTime); 
} catch (ParseException e) { 
    throw new InvalidInputException("Invalid date input."); 
} 

Produkuje:

Sun 30 grudnia 2012 08:30:00 EST (błędnie)

Próbowałem ustawienie łagodniejszej wyłączyć, ale bez powodzenia.

Aktualizacja

Sudhanshu Dzięki za odpowiedź, to pomogło mi rozwiązać konwersji Java. Po wprowadzeniu zwróconej daty z powyższego kodu do bazy danych otrzymuję prawidłową datę, ale zawsze jest godzina 00:00.

ps.setDate(3, new java.sql.Date(app.getDate().getTime())); 
+0

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. " –

Odpowiedz

32

YYYY powinny być yyyy-

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH); 

Proszę sprawdzić dokumentację dla SimpleDateFormat tutaj
Java 6: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
Java 7: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

+0

Dziękuję za odpowiedź. Rozwiązałem początkowy problem. Kiedy wprowadzam wartość do bazy daty, otrzymuję prawidłową datę, ale czas jest zawsze 00:00. ps.setDate (3, nowa java.sql.Date (app.getDate(). getTime())); – Sas

6

używać małych przypadek Y, a nie czapki. tj yyyy nie YYYY

Sprawdź komentarze: Java Simple Date Format i inne odpowiedzi odwołuje tam.

4

Występują dwa problemy.

  1. Ciąg formatu powinien wynosić "yyyy-MM-dd HH:mm".
  2. Datatype do przechowywania czasu jest TimeStamp i nie Date w bazie danych.

Popraw oba te elementy i będziesz w stanie przechowywać i pobierać datę w czasie.

1

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().