2013-04-10 8 views
6

Sto cercando di analizzare uno String (YYYY-MM-dd HH:mm) a Date, tuttavia ottenere una data errata del previsto.SimpleDateFormat che genera un'ora di data errata durante l'analisi di "AAAA-MM-gg HH: mm"

CODICE:

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."); 
} 

produce:

Sole 30 Dicembre 08:30:00 EST 2012 (sbagliato)

ho provato a installare Lenient fuori, ma senza fortuna.

Aggiornamento

Grazie Sudhanshu per la risposta, mi ha aiutato a risolvere la conversione Java. Quando inserisco la data restituita dal codice sopra nel database, sto ottenendo correttamente la data ma l'ora è sempre 00:00.

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

Per l'aggiornamento, 'java.sql.Date' è solo per una data, intesa per il tipo di dati di data di SQL. Dalla documentazione: "Per conformarsi alla definizione di SQL DATE, i valori millisecondi racchiusi da un'istanza java.sql.Date devono essere 'normalizzati' impostando le ore, i minuti, i secondi e i millisecondi a zero nel particolare fuso orario con a cui è associata l'istanza. " –

risposta

32

AAAA dovrebbe essere YYYY

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

Si prega di controllare la documentazione per SimpleDateFormat qui
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

Grazie per la risposta. Ho risolto il problema iniziale. Quando inserisco il valore nel data base sto ricevendo la data correttamente ma l'ora sempre 00:00. ps.setDate (3, new java.sql.Date (app.getDate(). getTime())); – Sas

6

Usa piccolo caso Y, non tappi. ie aaaa non YYYY

Controllare i commenti qui: Java Simple Date Format e altre risposte a cui si fa riferimento.

4

Ci sono due problemi.

  1. La stringa di formato deve essere "yyyy-MM-dd HH:mm".
  2. Il tipo di dati per memorizzare l'ora è TimeStamp e non Date nel database.

Correggere entrambe le cose e sarà possibile memorizzare e recuperare la data con il tempo.

1

Ecco la risposta moderna. Le altre risposte sono state ottime risposte quando sono state scritte nel 2013. L'anno successivo l'API moderna per data e ora è stata sostituita dalle vecchie classi Date, SimpleDateFormat e amici. IMHO dovresti usare le nuove classi ora. Sono molto più programmabili.

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."); 
    } 

Fatta eccezione per i nomi delle classi, non è diverso dal vecchio codice. Con altri esempi ci saranno differenze, in genere le classi moderne forniranno codice più chiaro e meno opportunità di errori.

Per un solo piccola dimostrazione di una differenza, proviamo la stringa di modello di formato che hai avuto con lettere maiuscole YYYY in esso:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm", Locale.ENGLISH); 

Ora il codice lancia un 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. È lungo, lo so. La cosa da notare è che non c'è un anno tra i campi menzionati, solo un WeekBasedYear. Non è lo stesso; e probabilmente avrete capito che questo è esattamente perché il maiuscolo Y è per l'anno della settimana (solo usso con un numero di settimana), dove dovreste usare il minuscolo y per anno. Considero questo comportamento un po 'più utile di quello che facevano le vecchie classi: ti davano un risultato sbagliato, facevano finta che tutto andasse bene e ti lasciavano completamente all'oscuro su ciò che era sbagliato.

Avanti Capisco che si desidera memorizzare la data-ora in un database. In passato si converte in un appropriato tipo java.sql. Non è più necessario. Credo che con un driver JDBC 4.2 basta fare:

ps.setObject(3, newDate); 

Non ho ancora provato questo con un database. Si noti che si utilizza setObject() anziché setDate().

Problemi correlati