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