Come ottenere anno, mese, giorno, ore, minuti, secondi e millisecondi del momento corrente in Java?


104

Come posso ottenere l'anno, il mese, il giorno, le ore, i minuti, i secondi e i millisecondi del momento corrente in Java? Mi piacerebbe averli come Strings.

Risposte:


254

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

Guarda anche:


Se intendi utilizzare printf, potresti anche utilizzare i formati per Data / Ora invece di utilizzare il passaggio intermedio, ad esempio "% 1 $ tm% 1 $ te,% 1 $ tY", c (vedi java.util. Formattatore per la sintassi completa)
M. Jessup

1
@M. Jessup: È davvero più carino. Tuttavia non l'ho mai usato, quindi non potevo inserirlo dall'alto della testa, quanto sopra è solo a scopo dimostrativo. Indipendentemente da ciò, preferirei afferrare SimpleDateFormato DateTimeFormatterper quel particolare compito :)
BalusC

Consiglio vivamente di utilizzare joda-time, poiché è un'API molto più bella e comprensibile rispetto alle date e ai calendari mal progettati che Java offre direttamente.
Kaitsu

Preferisco questo, specialmente nel lavoro i18n per ottenere startTime o endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy

1
Gran parte della funzionalità java.time è stata trasferita su Java 6 e 7 nel progetto ThreeTen-Backport .
Basil Bourque

30

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).


1
Cordiali saluti, il progetto Joda-Time è ora in manutenzione, con il suo team che consiglia la migrazione alle classi java.time. Sia Joda-Time che java.time sono guidati dallo stesso uomo, Stephen Colebourne.
Basil Bourque

7
    // 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()));

Questa risposta affronta davvero la domanda, che chiedeva informazioni sull'accesso ai componenti di un valore data-ora (non le solite stringhe formattate).
Basil Bourque,

6

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.
Basil Bourque

Hai ragione. Ho modificato la mia risposta per utilizzare un file ZonedDateTime.
Ortomala Lokni

3

tl; dr

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/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() ) ;

DateTimeFormatter

Per produrre un Stringper combinare parti di testo, usa DateTimeFormatterclass. 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 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.


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à 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?


2

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()));
    }
}

Penso che tu abbia frainteso sia la domanda che l'uso del timestamp sql. Normalmente useresti new Date()qui. Ma come si ottengono facilmente le parti separate come richiesto?
BalusC

Cordiali saluti, è java.sql.Timestampstato soppiantato dal java.time.Instantcon l'arrivo di JDBC 4.2.
Basil Bourque

0

in java 7 Calendar una riga

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())

1
Le fastidiose classi Calendar e SimpleDateFormat sono ora obsolete, soppiantate completamente dalle classi java.time. Vedere la risposta di BalusC per l'approccio moderno. Gran parte della funzionalità java.time è stata trasferita su Java 6 e 7 nel progetto ThreeTen-Backport .
Basil Bourque


-2

Calendar now = new Calendar () // o new GregorianCalendar (), o qualunque gusto tu abbia bisogno

adesso.MESE adesso.ORA

eccetera.


3
Ciao, ho difficoltà a capire perché stai ripetendo una risposta già data in modo scadente. Si prega di elaborare :)
BalusC

3
MONTHe HOURsono costanti statiche di Calendar, non proprietà di istanza.
Joseph Earl
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.