Java'da yıl, ay, gün, saat, dakika, saniye ve milisaniye nasıl alınır?


104

Java'da mevcut anın yıl, ay, gün, saat, dakika, saniye ve milisaniyesini nasıl alabilirim? Onlara sahip olmak isterim Strings.

Yanıtlar:


255

Bunun için alıcılarını kullanabilirsiniz java.time.LocalDateTime.

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

Veya henüz Java 8 kullanmadığınızda yararlanın 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);

Her iki durumda da, bu şu andan itibaren yazdırılır:

2010-04-16 15: 15: 17.816

Bir biçimine dönüştürmek intiçin String, kullanın String#valueOf().


Sonuçta niyetiniz bunları insan dostu bir dize biçiminde düzenlemek ve görüntülemekse, o zaman Java8'leri java.time.format.DateTimeFormatter( öğretici burada ) kullanın,

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

veya henüz Java 8 kullanmadığınızda, şunu kullanın 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);

Her iki durumda da, bu şunları sağlar:

2010-04-16T15: 15: 17.816
16 Nisan 2010 Cuma 15:15:17 GMT
20100416151517

Ayrıca bakınız:


Printf kullanacaksanız, ara adımı kullanmak yerine sadece Tarih / Saat formatlarını kullanabilirsiniz, yani "% 1 $ tm% 1 $ te,% 1 $ tY", c (bkz. Java.util. Tam sözdizimi için biçimlendirici)
M.Jessup

1
@M. Jessup: Bu gerçekten daha güzel. Ancak bunu hiç kullanmadım, bu yüzden baştan sona giremedim, yukarıdakiler sadece demo amaçlı. Ne olursa olsun, bu özel görevi SimpleDateFormatya da kapmayı tercih ederim DateTimeFormatter:)
BalusC

Java'nın doğrudan sunduğu kötü tasarlanmış Tarihler ve Takvimlerle karşılaştırıldığında çok daha güzel ve anlaşılır API'sı olduğundan joda-time kullanmanızı şiddetle öneririm.
Kaitsu

Bunu, özellikle i18n çalışmasında startTime veya endTime almak için tercih ediyorum:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy,

1
ThreeTen-Backport projesinde java.time işlevinin çoğu Java 6 ve 7'ye geri aktarılmıştır .
Basil Bourque

30

Geçin joda zamanlı ve üç satır yapabilirsiniz

DateTime jodaTime = new DateTime();

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

Ayrıca, bir Takvim kullanmadan tarihin ayrı alanlarına doğrudan erişebilirsiniz.

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

Çıktı aşağıdaki gibidir:

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

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

Http://www.joda.org/joda-time/ adresine göre

Joda-Time, Java için fiili standart tarih ve saat kitaplığıdır. Java SE 8'den itibaren, kullanıcılardan java.time'a (JSR-310) geçmeleri istenir.


1
Bilginize, Joda-Time projesi şu anda bakım aşamasındadır ve ekibinin java.time sınıflarına geçişi tavsiye etmesi. Hem Joda-Time hem de java.time aynı adam Stephen Colebourne tarafından yönetiliyor.
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()));

Bu yanıt, bir tarih-saat değerinin bileşenlerine (normal biçimlendirilmiş dizelere değil) erişmeyi soran Soruya gerçekten hitap ediyor.
Basil Bourque

6

Java 8 ve üstü ile java.time paketini kullanın .

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

ZonedDateTime.now()varsayılan saat diliminde sistem saatinden geçerli tarih-saati döndüren statik bir yöntemdir. Tüm get yöntemleri bir intdeğer döndürür .


LocalDateTimebunun için kesinlikle yanlış sınıftır. Herhangi bir zaman dilimi veya UTC'den sapma kavramı olmadığı için, belirli bir anı izlemek için kullanılamaz , zaman çizelgesinde bir nokta değildir . Kullanım Instant, ZonedDateTimeya OffsetDateTimeonun yerine.
Basil Bourque

Haklısın. Cevabımı a kullanmak için değiştirdim 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

Belirli bir bölgedeki (bir saat dilimi) insanlar tarafından kullanılan duvar saati saatinde görüldüğü şekliyle mevcut anı yakalamak için kullanın ZonedDateTime.

Tarih belirlemede saat dilimi çok önemlidir. Herhangi bir an için tarih, dünya genelinde bölgeye göre değişir. Örneğin, Paris'te gece yarısından birkaç dakika sonra Fransa , Montréal Québec'te hala "dün" iken yeni bir gündür .

Saat dilimi belirtilmezse, JVM, geçerli varsayılan saat dilimini örtük olarak uygular. Bu varsayılan çalışma süresi (!) Sırasında herhangi bir anda değişebilir, bu nedenle sonuçlarınız değişebilir. İstediğiniz / beklenen saat dilimini açıkça bir bağımsız değişken olarak belirtmek daha iyidir.

Bir belirtme uygun bir zaman dilimi adı biçiminde continent/regiongibi America/Montreal, Africa/Casablancaya da Pacific/Auckland. Hiçbir zaman gibi 3-4 harfli bir kısaltma kullanın ESTveya ISToldukları gibi değil , gerçek zaman dilimleri, değil standardize ve hatta benzersiz değil (!).

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

Tarih-saatin parçalarını çıkarmak için birçok alıcıdan herhangi birini arayın.

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

Java.time sınıfları çözümlemek nanosaniye . Sorunuz, milisaniye cinsinden saniyenin kesirini sordu . Açıktır ki, olası veri kaybı pahasına nanosaniyeyi milisaniyeye kesmek için bir milyona bölebilirsiniz. Veya TimeUnitbu tür dönüştürme için numaralandırmayı kullanın .

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

DateTimeFormatter

Bir Stringmetin parçalarını birleştirmek için DateTimeFormattersınıf kullanın . Bununla ilgili daha fazla bilgi için Yığın Taşması'nı arayın.

Instant

Anları UTC'de izlemek genellikle en iyisidir. Bölgelere ayrılmış bir tarih-saati UTC'ye ayarlamak için a Instant.

Instant instant = zdt.toInstant() ;

Ve tekrar geri dönün.

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

LocalDateTime

Birkaç başka Cevap LocalDateTimesınıfı kullanır . Bu sınıf, gerçek anları, zaman çizelgesindeki belirli anları izleme amacına uygun değildir, çünkü kasıtlı olarak herhangi bir saat dilimi veya UTC'den sapma kavramından yoksundur.

Öyleyse ne için LocalDateTimeiyidir? Belirli bir yer yerine herhangi bir bölgeye veya tüm bölgelereLocalDateTime tarih ve saat uygulamayı düşündüğünüzde kullanın .

Örneğin, Noel bu yıl LocalDateTime.parse( "2018-12-25T00:00:00" ). Bir saat dilimi (a ZoneId) uygulayana kadar bu değerin hiçbir anlamı yoktur ZonedDateTime. Noel önce Kiribati'de , sonra Yeni Zelanda ve uzak doğu Asya'da gerçekleşir. Saatler sonra Hindistan'da Noel başlıyor. Afrika ve Avrupa'da bir saat sonra. Ve birkaç saat sonrasına kadar Amerika'da hala Noel değil. Herhangi bir yerde başlayan Noel ile temsil edilmelidir ZonedDateTime. Noel her yerde bir LocalDateTime.


Hakkında java.time

Java.time çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date, Calendar& SimpleDateFormat.

Şu anda bakım modunda olan Joda-Time projesi, java.time sınıflarına geçişi önerir .

Daha fazla bilgi edinmek için Oracle Eğitimi'ne bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .

Java.time nesnelerini doğrudan veritabanınız ile değiş tokuş edebilirsiniz . JDBC 4.2 veya üstü ile uyumlu bir JDBC sürücüsü kullanın . Dizelere gerek yok, derslere gerek yok .java.sql.*

Java.time sınıflarını nereden edinebilirim?


2

Veya java.sql.Timestamp kullanın. Takvim biraz ağır, üretim kodunda kullanılmamasını tavsiye ederim. Joda daha iyidir.

import java.sql.Timestamp;

public class DateTest {

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

Sql zaman damgasının hem sorusunu hem de kullanımını yanlış anladığınızı düşünüyorum. Normalde new Date()burada kullanırsınız . Ama istendiği gibi ondan ayrı parçaları kolayca nasıl alırsınız?
BalusC

Bilginize, JDBC 4.2'nin gelişiyle java.sql.Timestampyerini aldı java.time.Instant.
Basil Bourque

0

Java'da 7 Takvim tek satır

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

1
Zahmetli Calendar ve SimpleDateFormat sınıfları artık modası geçmiş ve yerini tamamen java.time sınıfları almıştır. Modern yaklaşım için BalusC'un Cevabına bakın . ThreeTen-Backport projesinde java.time işlevinin çoğu Java 6 ve 7'ye geri aktarılmıştır .
Basil Bourque


-2

Takvim şimdi = yeni Takvim () // veya yeni GregorianCalendar () veya ihtiyacınız olan her tür

now.MONTH now.HOUR

vb.


3
Merhaba, zaten verilmiş bir cevabı neden kötü bir şekilde tekrarladığınızı anlamakta zorlanıyorum. Lütfen detaylandırın :)
BalusC

3
MONTHve örnek özelliklerinin değil HOURstatik sabitleridir Calendar.
Joseph Earl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.