Java'da dize biçiminde geçerli zaman damgası nasıl alınır? “Yyyy.MM.dd.HH.mm.ss”


174

Java'da dize biçiminde zaman damgası nasıl alınır? "Yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

Bu ne var, ama Timestamp () bir parametre gerektirir ...


hazırlık durumu.setTimestamp (1, yeni Zaman Damgası (System.currentTimeMillis ()));
Rajat

Ne hatası alıyorsunuz?
Robert Columbia

Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları SimpleDateFormatve java.sql.Timestampşimdi eski supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:



160

Kullanım java.util.Dateyerine damgalamasanız sınıfı.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

Bu size geçerli formatı belirtilen formatta verecektir.


5
Bu bana yardımcı oldu ve bazı değişiklikler yaptım bu yüzden ithalat zorunda değilim new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni

Daha iyi new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon

36

tl; Dr.

Yalnızca modern java.time sınıflarını kullanın . Hiçbir zaman gibi korkunç mirası sınıflarını kullanmak SimpleDateFormat, Dateya da java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Veya JVM'nin geçerli varsayılan saat dilimini kullanın.

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time ve JDBC 4.2

Modern yaklaşım, yukarıda görüldüğü gibi java.time sınıflarını kullanır .

Senin Eğer JDBC sürücüsü ile uyumlu olduğu JDBC 4.2 , doğrudan alışverişi yapabilir java.time veritabanı ile nesneler. Kullanım PreparedStatement::setObjectve ResultSet::getObject.

Java.sql dosyasını yalnızca JDBC 4.2'den önceki sürücüler için kullanın

JDBC sürücünüz java.time türlerini desteklemek için henüz JDBC 4.2 ile uyumlu değilse , java.sql sınıflarını kullanmaya geri dönmeniz gerekir.

Veri depolama.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Veri alınıyor.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Gibi java.sql türleri java.sql.Timestampsadece veritabanına giriş ve çıkış için kullanılmalıdır. Hemen Java 8 ve sonraki sürümlerde java.time türlerine dönüştürün.

java.time.Instant

A java.sql.Timestampbir eşleştiren java.time.Instant, UTC zaman çizelgesi üzerinde bir an. toInstantEski sınıfa eklenen yeni dönüşüm yöntemine dikkat edin .

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Saat dilimi

Almak için istenen / beklenen zaman dilimini ( ZoneId) uygulayın ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Biçimlendirilmiş Dizeler

Dizenizi DateTimeFormatteroluşturmak için a kullanın . Desen kodları, bunlara benzer, java.text.SimpleDateFormatancak tam olarak değil, bu yüzden dokümanı dikkatlice okuyun.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Bu özel biçim, UTC'den veya saat dilimi farkı göstergesinden yoksun olduğu için tam anlamıyla belirsizdir .

ISO 8601

Bu konuda herhangi bir sözünüz varsa , kendinize göre yazmak yerine standart ISO 8601 formatlarını kullanmanızı öneririz . Standart biçim sizinkine oldukça benzer. Örneğin:
2016-02-20T03:26:32+05:30.

Java.time sınıfları varsayılan olarak bu standart formatları kullanır, bu nedenle bir desen belirtmenize gerek yoktur. ZonedDateTimeSınıf zaman bölgenin adını (akıllı bir gelişme) ekleyerek standart bir biçim uzanır.

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Java.sql dosyasına dönüştür

Java.time biçiminden dönüştürebilirsiniz java.sql.Timestamp. Bir Özü Instantdan ZonedDateTime.

Java.time sınıflarına / sınıflarından dönüştürmeyi kolaylaştırmak için eski sınıflara yeni yöntemler eklenmiştir.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Java'da (hem eski hem de modern) ve standart SQL'de tarih-saat türleri tablosu


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.

Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .

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

Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*

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

ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval, YearWeek, YearQuarter, ve daha .


Peki geçerli duvar saati zaman damgasını "yyyy.MM.dd.HH.mm.ss" biçiminde almanın Doğru Yolu nedir? Yerel saat dilimimin sabit kodlu dizesini açıkça belirtmeden? Starter'ın sorduğu konu buydu ve cevabınızda bulamadım ...
t7ko

@ t7ko tl; dr bölümüne , JVM'nin geçerli varsayılan saat dilimini açıkça sormayı gösteren bir örnek kod satırı ekledim . Herhangi bir argüman olmadan `` now () '' çağırmak aynıdır, ancak varsayılanı kullanmak istediğinizde veya saat diliminin önemli sorunu hakkında cahil veya unutkansanız açık değildir.
Basil Bourque

32

Zaman damgası yerine java.util.Date komutunu kullanabilirsiniz:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

6

Daha uygun bir yaklaşım, yapıcıda parametre olarak bir Yerel Ayar bölgesini belirtmektir. Aşağıdaki örnekte ABD Yerel Ayarı bölgesi kullanılmıştır. Tarih biçimlendirmesi yerel ayara duyarlıdır ve bilgileri, kullanıcının yerel ayarının gelenek ve kurallarına göre uyarlamak için Yerel Ayarı kullanır (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

1
“Yerel Bölge” diye bir şey yok. Ben senin kafa karıştırıcı Localeve ilgisiz olan zaman dilimi olduğundan şüpheleniyorum . Localebiçimlendirme için kültürel normları ve ay / gün adı için kullanılan insan dilini kontrol eder. Saat dilimi, tarih-saat gösterimini, bir bölgenin duvar saati saatine uygun olacak şekilde ayarlar . Bu Soru durumunda, kültürel normların uygulanacağı biçimlendirme sorunları olmadığından veya belirli bir insan diline yerelleştirmek için herhangi bir ay / gün adı bulunmadığından, Yerel Ayar önemsizdir.
Basil Bourque

@BasilBourque Girişiniz için teşekkür ederiz. Cevabı daha açık olacak şekilde güncelledim
user3144836

4

Aşağıdakileri kullanabilirsiniz

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Umarım bu yardımcı olur. Sadece benim önerim ve ödül puanları için değil.


İstenen dize biçimine sahip değil. Ayrıca korkarım ki benzer cevaplara eklediği tek şey gereksiz bir komplikasyon…
Ole VV

4

java.timeJava 8 veya daha yenisini kullanıyorsanız modern sınıflar kullanın .

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Basil Bourque'nin cevabı oldukça iyi. Ama çok uzun. Birçok insanın bunu okumak için sabrı yoktur. İlk 3 cevap çok eski ve Java yeni arı yanıltıcı olabilir.Bu yüzden yeni gelen geliştiriciler için bu kısa ve modern cevap sağlamak. Umarım bu cevap korkunç kullanımını azaltabilir SimpleDateFormat.

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.