Wie kann man in Java Jahr, Monat, Tag, Stunden, Minuten, Sekunden und Millisekunden des aktuellen Moments abrufen?


104

Wie kann ich das Jahr, den Monat, den Tag, die Stunden, Minuten, Sekunden und Millisekunden des aktuellen Moments in Java abrufen? Ich hätte sie gerne als Strings.

Antworten:


254

Sie können die Getter von java.time.LocalDateTimedafür verwenden.

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

Oder, wenn Sie noch nicht mit Java 8 arbeiten, nutzen Sie 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);

In beiden Fällen wird ab sofort gedruckt:

2010-04-16 15: 15: 17.816

Verwenden Sie zum Konvertieren eines intin .StringString#valueOf()


Wenn Ihre Absicht ist , nachdem alle sie in einem menschlichen freundlichen String - Format zu organisieren und anzuzeigen, und eine bessere Nutzung entweder Java8 der java.time.format.DateTimeFormatter( Tutorial hier ),

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

oder wenn Sie noch nicht mit Java 8 arbeiten, verwenden Sie 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 jedem Fall ergibt dies:

2010-04-16T15: 15: 17.816
Fr, 16 Apr 2010 15:15:17 GMT
20100416151517

Siehe auch:


Wenn Sie printf verwenden möchten, können Sie auch einfach die Formate für Datum / Uhrzeit verwenden, anstatt den Zwischenschritt "% 1 $ tm% 1 $ te,% 1 $ tY", c (siehe java.util) zu verwenden. Formatierer für die vollständige Syntax)
M. Jessup

1
@M. Jessup: Das ist in der Tat schöner. Ich habe es jedoch nie benutzt, so dass ich es nicht von oben eingeben konnte. Das obige ist nur für Demozwecke. Egal, ich würde lieber greifen SimpleDateFormatoder DateTimeFormatterfür diese bestimmte Aufgabe :)
BalusC

Ich würde dringend empfehlen, joda-time zu verwenden, da die API im Vergleich zu den schlecht gestalteten Daten und Kalendern, die Java direkt anbietet, viel besser und verständlicher ist.
Kaitsu

Ich bevorzuge diese, besonders in der i18n-Arbeit, um startTime oder endTime zu erhalten:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy

1
Ein Großteil der Funktionen von java.time wird im ThreeTen-Backport- Projekt auf Java 6 und 7 zurückportiert .
Basil Bourque

30

Wechseln Sie zur Joda-Zeit und Sie können dies in drei Zeilen tun

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

Sie haben auch direkten Zugriff auf die einzelnen Felder des Datums, ohne einen Kalender zu verwenden.

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

Die Ausgabe ist wie folgt:

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

Laut http://www.joda.org/joda-time/

Joda-Time ist die De-facto-Standardbibliothek für Datum und Uhrzeit für Java. Ab Java SE 8 werden Benutzer aufgefordert, auf java.time (JSR-310) zu migrieren.


1
Zu Ihrer Information, das Joda-Time-Projekt befindet sich derzeit in der Wartung. Das Team empfiehlt die Migration zu den Klassen java.time. Sowohl Joda-Time als auch java.time werden von demselben Mann geführt, 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()));

Diese Antwort befasst sich wirklich mit der Frage, die nach dem Zugriff auf die Komponenten eines Datums- / Uhrzeitwerts (nicht der üblichen formatierten Zeichenfolgen) gefragt wurde.
Basil Bourque

6

Verwenden Sie unter Java 8 und höher das Paket java.time .

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()ist eine statische Methode, die das aktuelle Datum und die aktuelle Uhrzeit von der Systemuhr in der Standardzeitzone zurückgibt. Alle get-Methoden geben einen intWert zurück.


LocalDateTimeist genau die falsche Klasse dafür. Ohne ein Konzept der Zeitzone oder des Versatzes von UTC kann es nicht verwendet werden, um einen bestimmten Moment zu verfolgen, es ist kein Punkt auf der Zeitachse. Verwendung Instant, ZonedDateTimeoder OffsetDateTimestatt.
Basil Bourque

Du hast recht. Ich habe meine Antwort geändert, um a zu verwenden 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

Verwenden Sie, um den aktuellen Moment in der Wanduhrzeit zu erfassen, die von den Personen einer bestimmten Region (einer Zeitzone) verwendet wird ZonedDateTime.

Eine Zeitzone ist entscheidend für die Bestimmung eines Datums. Für jeden Moment variiert das Datum weltweit je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während es in Montréal Québec noch „gestern“ ist .

Wenn keine Zeitzone angegeben ist, wendet die JVM implizit ihre aktuelle Standardzeitzone an. Diese Standardeinstellung kann sich jederzeit zur Laufzeit (!) Ändern , sodass Ihre Ergebnisse variieren können. Geben Sie Ihre gewünschte / erwartete Zeitzone besser explizit als Argument an.

Geben Sie einen richtigen Zeitzonennamen im Format continent/region, wie zum Beispiel America/Montreal, Africa/Casablancaoder Pacific/Auckland. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben, wie ESToder, ISTda es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Rufen Sie einen der vielen Getter an, um Teile der Datums- und Uhrzeitangabe herauszuholen.

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

Die java.time- Klassen werden in Nanosekunden aufgelöst . Ihre Frage wurde in Sekundenbruchteilen in Millisekunden gestellt . Offensichtlich können Sie durch eine Million dividieren, um Nanosekunden auf Millisekunden zu reduzieren, und zwar auf Kosten eines möglichen Datenverlusts. Oder verwenden Sie die TimeUnitAufzählung für eine solche Konvertierung.

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

Zur Herstellung einer StringTextstück zu kombinieren, verwendet DateTimeFormatterKlasse. Suchen Sie im Stapelüberlauf nach weiteren Informationen dazu.

Instant

Normalerweise ist es am besten, Momente in UTC zu verfolgen. Extrahieren Sie a, um von einer Datums- / Uhrzeit in Zonen auf UTC umzustellen Instant.

Instant instant = zdt.toInstant() ;

Und geh wieder zurück.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

Einige andere Antworten verwenden die LocalDateTimeKlasse. Diese Klasse ist nicht für den Zweck geeignet, tatsächliche Momente, bestimmte Momente auf der Zeitachse zu verfolgen, da ihr absichtlich ein Konzept der Zeitzone oder des Versatzes von UTC fehlt.

Wofür ist das LocalDateTimegut? Verwenden LocalDateTimeSie diese Option, wenn Sie ein Datum und eine Uhrzeit auf einen Ort oder alle Orte anstatt auf einen bestimmten Ort anwenden möchten.

Zum Beispiel beginnt Weihnachten dieses Jahr am LocalDateTime.parse( "2018-12-25T00:00:00" ). Dieser Wert hat keine Bedeutung, bis Sie eine Zeitzone (a ZoneId) anwenden , um a zu erhalten ZonedDateTime. Weihnachten findet zuerst in Kiribati statt , später in Neuseeland und Fernostasien. Stunden später beginnt Weihnachten in Indien. Weitere Stunden später in Afrika und Europa. Und erst einige Stunden später noch Weihnachten auf dem amerikanischen Kontinent. Weihnachten in jedem Start eines Orts soll dargestellt werden ZonedDateTime. Weihnachten ist überall mit einem dargestellt LocalDateTime.


Über java.time

Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date, Calendar, & SimpleDateFormat.

Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .

Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .

Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.

Woher bekomme ich die java.time-Klassen?


2

Oder verwenden Sie java.sql.Timestamp. Der Kalender ist ziemlich schwer, ich würde empfehlen, ihn nicht im Produktionscode zu verwenden. Joda ist besser.

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}

Ich denke, Sie haben sowohl die Frage als auch die Verwendung des SQL-Zeitstempels falsch verstanden. Sie würden normalerweise new Date()hier verwenden. Aber wie würden Sie die einzelnen Teile einfach wie gewünscht daraus erhalten?
BalusC

Zu Ihrer Information, java.sql.Timestampwurde durch die java.time.Instantmit der Ankunft von JDBC 4.2 ersetzt.
Basil Bourque

0

in Java 7 Kalender eine Zeile

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

1
Die problematischen Klassen Calendar und SimpleDateFormat sind jetzt veraltet und werden vollständig durch die Klassen java.time ersetzt. Siehe die Antwort von BalusC für den modernen Ansatz. Ein Großteil der Funktionen von java.time wird im ThreeTen-Backport- Projekt auf Java 6 und 7 zurückportiert .
Basil Bourque


-2

Kalender jetzt = neuer Kalender () // oder neuer Gregorianischer Kalender () oder was auch immer Sie brauchen

now.MONTH now.HOUR

etc.


3
Hallo, es fällt mir schwer zu verstehen, warum Sie eine bereits gegebene Antwort auf schlechte Weise wiederholen. Bitte
näher

3
MONTHund HOURsind statische Konstanten von Calendar, nicht Instanzeigenschaften.
Joseph Earl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.