Yanıtlar:
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 int
iç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
SimpleDateFormat
ya da kapmayı tercih ederim DateTimeFormatter
:)
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
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.
// 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()));
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 int
değer döndürür .
LocalDateTime
bunun 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
, ZonedDateTime
ya OffsetDateTime
onun yerine.
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
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/region
gibi America/Montreal
, Africa/Casablanca
ya da Pacific/Auckland
. Hiçbir zaman gibi 3-4 harfli bir kısaltma kullanın EST
veya IST
oldukları 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 TimeUnit
bu tür dönüştürme için numaralandırmayı kullanın .
long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;
DateTimeFormatter
Bir String
metin parçalarını birleştirmek için DateTimeFormatter
sı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 LocalDateTime
sı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 LocalDateTime
iyidir? 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
.
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?
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()));
}
}
new Date()
burada kullanırsınız . Ama istendiği gibi ondan ayrı parçaları kolayca nasıl alırsınız?
java.sql.Timestamp
yerini aldı java.time.Instant
.
Java'da 7 Takvim tek satır
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
Java.util.Calendar sınıfı ve türevleri için API belgelerine bakın (özellikle GregorianCalendar sınıfıyla ilgileniyor olabilirsiniz).
java.util.Date
, java.util.Calendar
ve java.text.SimpleDateFormat
şimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Eğitimi bölümüne bakın .
Takvim şimdi = yeni Takvim () // veya yeni GregorianCalendar () veya ihtiyacınız olan her tür
now.MONTH now.HOUR
vb.
MONTH
ve örnek özelliklerinin değil HOUR
statik sabitleridir Calendar
.