Come ottenere il timestamp corrente in formato stringa in Java? “Yyyy.MM.dd.HH.mm.ss”


174

Come ottenere il timestamp in formato stringa in Java? "Yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Questo è quello che ho, ma Timestamp () richiede un parametro ...


preparedStatement.setTimestamp (1, nuovo Timestamp (System.currentTimeMillis ()));
Rajat,

Che errore stai ricevendo?
Robert Columbia,

Cordiali saluti, le vecchie classi terribilmente problematiche come data SimpleDateFormate java.sql.Timestampora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:



160

Usa la java.util.Dateclasse invece di Timestamp.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Questo ti porterà la data corrente nel formato specificato.


5
Questo mi ha aiutato e ho apportato alcune modifiche, quindi non devo importare new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni il

Meglio new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon,

36

tl; dr

Usa solo le moderne classi java.time . Non usare mai le classi precedenti terribili, come SimpleDateFormat, Dateo java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Oppure utilizza il fuso orario predefinito corrente della JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time e JDBC 4.2

L'approccio moderno utilizza le classi java.time come visto sopra.

Se il driver JDBC è conforme a JDBC 4.2 , è possibile scambiare direttamente oggetti java.time con il database. Usa PreparedStatement::setObjecte ResultSet::getObject.

Utilizzare java.sql solo per i driver precedenti a JDBC 4.2

Se il driver JDBC non è ancora conforme a JDBC 4.2 per il supporto dei tipi java.time , è necessario ricorrere all'utilizzo delle classi java.sql.

Memorizzazione dei dati.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Recupero dati.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

I tipi java.sql, come ad esempio java.sql.Timestamp, devono essere utilizzati solo per il trasferimento all'interno e all'esterno del database. Converti immediatamente in tipi java.time in Java 8 e versioni successive.

java.time.Instant

Una java.sql.Timestampmappa a java.time.Instant, un momento sulla linea temporale in UTC. Nota il nuovo metodo di conversione toInstantaggiunto alla vecchia classe.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Fuso orario

Applicare il fuso orario desiderato / previsto ( ZoneId) per ottenere a ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Stringhe formattate

Utilizzare a DateTimeFormatterper generare la stringa. I codici modello sono simili a quelli di java.text.SimpleDateFormatma non esattamente, quindi leggi attentamente il documento.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Questo particolare formato è ambiguo per quanto riguarda il suo significato esatto in quanto privo di qualsiasi indicazione di offset da UTC o fuso orario.

ISO 8601

Se hai qualcosa da dire in proposito, ti suggerisco di prendere in considerazione l'utilizzo dei formati ISO 8601 standard anziché di quelli personalizzati. Il formato standard è abbastanza simile al tuo. Ad esempio:
2016-02-20T03:26:32+05:30.

Le classi java.time utilizzano questi formati standard per impostazione predefinita, quindi non è necessario specificare un modello. La ZonedDateTimeclasse estende il formato standard aggiungendo il nome del fuso orario (un saggio miglioramento).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Converti in java.sql

Puoi convertire da java.time a java.sql.Timestamp. Estrai un Instantda ZonedDateTime.

Nuovi metodi sono stati aggiunti alle vecchie classi per facilitare la conversione in / da classi java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tabella dei tipi di data e ora in Java (sia legacy che moderna) e in SQL standard


Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*classi.

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


Allora, qual è il modo giusto per ottenere l'attuale timestamp in formato "yyyy.MM.dd.HH.mm.ss"? Senza specificare esplicitamente la stringa codificata nel mio fuso orario locale? Questo è quello che chiedeva l'antipasto e non sono riuscito a trovarlo nella tua risposta ...
t7ko

@ t7ko Ho aggiunto una riga di codice di esempio alla sezione tl; dr che mostra come chiedere esplicitamente l'attuale fuso orario predefinito della JVM. Chiamare `now () 'senza argomenti fa lo stesso ma non è chiaro se intendevi usare il valore predefinito o se eri ignorante o dimentico della questione cruciale del fuso orario.
Basil Bourque,

32

Puoi usare java.util.Date invece di Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

6

Un approccio più appropriato consiste nello specificare una regione Locale come parametro nel costruttore. L'esempio seguente utilizza un'area locale degli Stati Uniti. La formattazione della data è sensibile alle impostazioni locali e utilizza le impostazioni internazionali per personalizzare le informazioni relative alle abitudini e alle convenzioni delle impostazioni locali dell'utente (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

1
Nessuna cosa come "Zona Locale". Ho il sospetto che tu sia confuso Localee fuso orario che non sono correlati. Localecontrolla le norme culturali per la formattazione e il linguaggio umano usato per il nome del mese / giorno. Il fuso orario regola la rappresentazione della data e dell'ora in modo che corrisponda all'ora dell'orologio a muro di alcune regioni . Nel caso di questa domanda, Locale è irrilevante in quanto non ci sono problemi di formattazione con cui applicare le norme culturali né ci sono nomi di mese / giorno da localizzare in un particolare linguaggio umano.
Basil Bourque,

@BasilBourque Grazie per il tuo contributo. Ho aggiornato la risposta per essere più esplicita
user3144836

4

È possibile utilizzare quanto segue

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Spero che questo possa aiutare. Solo il mio suggerimento e non per i punti premio.


Non ha il formato stringa richiesto. Ho anche paura che l'unica cosa che aggiunge a un paio di risposte simili, sia inutile complicazione ...
Ole VV,

4

Usa le java.timeclassi moderne se usi java 8 o versioni successive.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

La risposta di Basil Bourque è piuttosto buona. Ma è troppo lungo. Molte persone non avrebbero la pazienza di leggerlo. Le prime 3 risposte sono troppo vecchie e possono indurre in errore la nuova ape Java. Quindi fornisco questa risposta breve e moderna per i nuovi sviluppatori in arrivo. Spero che questa risposta possa ridurre l'uso di terribili SimpleDateFormat.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.