Risposte:
Puoi usare i getter di java.time.LocalDateTimeper 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 intin 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
SimpleDateFormato DateTimeFormatterper 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 intvalore.
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, ZonedDateTimeo OffsetDateTimeinvece.
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
ZonedDateTimePer 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/Casablancao Pacific/Auckland. Non usare mai il 3-4 lettera sigla come ad esempio ESTo ISTcome 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' TimeUnitenumerazione per tale conversione.
long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;
DateTimeFormatterPer produrre un Stringper combinare parti di testo, usa DateTimeFormatterclass. Cerca Stack Overflow per maggiori informazioni su questo.
InstantDi 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" ) ) ;
LocalDateTimeUn paio di altre risposte usano la LocalDateTimeclasse. 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 LocalDateTimequando 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.Timestampstato soppiantato dal java.time.Instantcon 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.Calendare java.text.SimpleDateFormatsono 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.
MONTHe HOURsono costanti statiche di Calendar, non proprietà di istanza.