Risposte:
Puoi usare i getter di java.time.LocalDateTime
per quello.
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Oppure, quando non sei su Java 8 ancora, fare uso di java.util.Calendar
.
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Ad ogni modo, questo stampa fin da ora:
16-04-2010 15: 15: 17.816
Per convertire un int
in String
, usa String#valueOf()
.
Se il tuo intento è dopotutto quello di disporli e visualizzarli in un formato di stringa amichevole, allora è meglio usare Java8 java.time.format.DateTimeFormatter
( tutorial qui ),
LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
o quando non sei ancora su Java 8, usa java.text.SimpleDateFormat
:
Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
In ogni caso, questo produce:
2010-04-16T15: 15: 17,816 Ven, 16 aprile 2010 15:15:17 GMT 20100416151517
SimpleDateFormat
o DateTimeFormatter
per quel particolare compito :)
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Passa a joda-time e puoi farlo in tre righe
DateTime jodaTime = new DateTime();
DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));
Hai anche accesso diretto ai singoli campi della data senza utilizzare un calendario.
System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());
L'output è il seguente:
jodaTime = 2010-04-16 18:09:26.060
year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60
Secondo http://www.joda.org/joda-time/
Joda-Time è la libreria di data e ora standard de facto per Java. Da Java SE 8 in poi, agli utenti viene chiesto di migrare a java.time (JSR-310).
// Java 8
System.out.println(LocalDateTime.now().getYear()); // 2015
System.out.println(LocalDateTime.now().getMonth()); // SEPTEMBER
System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
System.out.println(LocalDateTime.now().getHour()); // 7
System.out.println(LocalDateTime.now().getMinute()); // 36
System.out.println(LocalDateTime.now().getSecond()); // 51
System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100
// Calendar
System.out.println(Calendar.getInstance().get(Calendar.YEAR)); // 2015
System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1); // 9
System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY)); // 7
System.out.println(Calendar.getInstance().get(Calendar.MINUTE)); // 35
System.out.println(Calendar.getInstance().get(Calendar.SECOND)); // 32
System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND)); // 481
// Joda Time
System.out.println(new DateTime().getYear()); // 2015
System.out.println(new DateTime().getMonthOfYear()); // 9
System.out.println(new DateTime().getDayOfMonth()); // 29
System.out.println(new DateTime().getHourOfDay()); // 7
System.out.println(new DateTime().getMinuteOfHour()); // 19
System.out.println(new DateTime().getSecondOfMinute()); // 16
System.out.println(new DateTime().getMillisOfSecond()); // 174
// Formatted
// 2015-09-28 17:50:25.756
System.out.println(new Timestamp(System.currentTimeMillis()));
// 2015-09-28T17:50:25.772
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));
// Java 8
// 2015-09-28T17:50:25.810
System.out.println(LocalDateTime.now());
// joda time
// 2015-09-28 17:50:25.839
System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));
Con Java 8 e versioni successive, utilizza il pacchetto java.time .
ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();
ZonedDateTime.now()
è un metodo statico che restituisce la data-ora corrente dall'orologio di sistema nel fuso orario predefinito. Tutti i metodi get restituiscono un int
valore.
LocalDateTime
è precisamente la classe sbagliata per questo. Mancando qualsiasi concetto di fuso orario o offset da UTC-, esso non può essere utilizzato per monitorare uno specifico momento, è non un punto sulla timeline. Usa Instant
, ZonedDateTime
o OffsetDateTime
invece.
ZonedDateTime
.
ZonedDateTime.now( // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "America/Montreal" ) // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMinute() // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.
42
ZonedDateTime
Per catturare il momento corrente come si vede nell'orario dell'orologio da parete utilizzato dalle persone di una particolare regione (un fuso orario), utilizzare ZonedDateTime
.
Un fuso orario è fondamentale per determinare una data. Per ogni dato momento, la data varia in tutto il mondo in base alla zona. Ad esempio, pochi minuti dopo la mezzanotte a Parigi, Francia, è un nuovo giorno mentre ancora "ieri" a Montréal Québec .
Se non viene specificato alcun fuso orario, la JVM applica implicitamente il proprio fuso orario predefinito corrente. Tale impostazione predefinita può cambiare in qualsiasi momento durante il runtime (!), Quindi i risultati possono variare. È meglio specificare esplicitamente il fuso orario desiderato / previsto come argomento.
Specificare un nome proprio fuso orario nel formato continent/region
, come ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non usare mai il 3-4 lettera sigla come ad esempio EST
o IST
come sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
Chiama uno dei tanti getter per estrarre parti della data-ora.
int year = zdt.getYear() ;
int monthNumber = zdt.getMonthValue() ;
String monthName = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ; // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int dayOfMonth = zdt.getDayOfMonth() ;
String dayOfWeek = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
int hour = zdt.getHour() ; // Extract the hour from the time-of-day.
int minute = zdt.getMinute() ;
int second = zdt.getSecond() ;
int nano = zdt.getNano() ;
I java.time classi decidono di nanosecondi . La tua domanda richiedeva la frazione di secondo in millisecondi . Ovviamente, puoi dividere per un milione per troncare nanosecondi in millisecondi, a costo di una possibile perdita di dati. Oppure usa l' TimeUnit
enumerazione per tale conversione.
long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;
DateTimeFormatter
Per produrre un String
per combinare parti di testo, usa DateTimeFormatter
class. Cerca Stack Overflow per maggiori informazioni su questo.
Instant
Di solito è meglio tenere traccia dei momenti in UTC. Per passare da una data e ora suddivisa in zone a UTC, estrai un file Instant
.
Instant instant = zdt.toInstant() ;
E torna di nuovo.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDateTime
Un paio di altre risposte usano la LocalDateTime
classe. Quella classe non è appropriata allo scopo di tracciare momenti reali, momenti specifici sulla sequenza temporale, in quanto manca intenzionalmente di qualsiasi concetto di fuso orario o offset da UTC.
Allora a cosa serve LocalDateTime
? Da utilizzare LocalDateTime
quando si intende applicare una data e un'ora a qualsiasi località oa tutte le località , anziché a una località specifica.
Ad esempio, il Natale di quest'anno inizia alle LocalDateTime.parse( "2018-12-25T00:00:00" )
. Quel valore non ha significato finché non applichi un fuso orario (a ZoneId
) per ottenere a ZonedDateTime
. Il Natale accade prima a Kiribati , poi in Nuova Zelanda e nell'estremo oriente asiatico. Ore dopo il Natale inizia in India. Più ora dopo in Africa e in Europa. E ancora non Natale nelle Americhe fino a diverse ore dopo. Natale a partire in qualsiasi un posto dovrebbe essere rappresentata con ZonedDateTime
. Il Natale ovunque è rappresentato con a LocalDateTime
.
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à di manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, vedere 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. Utilizza 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?
Oppure usa java.sql.Timestamp. Il calendario è piuttosto pesante, consiglierei di non utilizzarlo nel codice di produzione. Joda è migliore.
import java.sql.Timestamp;
public class DateTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new Timestamp(System.currentTimeMillis()));
}
}
new Date()
qui. Ma come si ottengono facilmente le parti separate come richiesto?
java.sql.Timestamp
stato soppiantato dal java.time.Instant
con l'arrivo di JDBC 4.2.
in java 7 Calendar una riga
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
Guarda la documentazione API per la classe java.util.Calendar e le sue derivate (potresti essere particolarmente interessato alla classe GregorianCalendar).
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
sono ora legacy , soppiantate dalle classi java.time incorporate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Calendar now = new Calendar () // o new GregorianCalendar (), o qualunque gusto tu abbia bisogno
adesso.MESE adesso.ORA
eccetera.
MONTH
e HOUR
sono costanti statiche di Calendar
, non proprietà di istanza.