23/09/2007 tarihli bir Zaman Damgasını nasıl oluşturabilirim?
Yanıtlar:
By Timestamp
, ne demek farz java.sql.Timestamp
. Bu sınıfın bir long
argümanı kabul eden bir kurucuya sahip olduğunu fark edeceksiniz . Bunu DateFormat
sınıfı kullanarak ayrıştırabilirsiniz :
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
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ğitimine bakın .
Peki buna ne dersin?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Zaman damgası ne demek? Unix döneminden beri geçen milisaniyeleri kastediyorsanız:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Gerçek bir java.sql.Timestamp nesnesi istiyorsanız:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Java 8 ve sonraki sürümlerde yerleşik olan java.time çerçevesini kullanarak kodu göstererek bu sayfayı güncelleyelim .
Bu yeni sınıflar, JSR 310 tarafından tanımlanan Joda-Time'dan esinlenmiştir ve ThreeTen-Extra projesi ile genişletilmiştir . Java'nın eski sürümleriyle birlikte gelen, kötü şöhretli zahmetli eski tarih-saat sınıflarının yerini alıyorlar.
Java.time'da, Instant
UTC'de zaman çizelgesindeki bir andır. A ZonedDateTime
, bir saat dilimine ( ZoneId
) ayarlanmış bir Anlıktır .
Saat dilimi burada çok önemlidir. Bir tarih, September 23, 2007
bir saat dilimi uygulanmadan zaman çizelgesindeki bir ana çevrilemez. Paris'te yeni bir günün hala "dün" olduğu Montréal'den daha erken doğduğunu düşünün.
Ayrıca, java.sql.Timestamp hem tarihi hem de günün saatini temsil eder. Bu yüzden, tarihe uymak için günün saatini enjekte etmeliyiz. Günün ilk anını günün saati olarak istediğinizi varsayıyoruz. 00:00:00.0
Yaz Saati Uygulaması ve muhtemelen diğer anormallikler nedeniyle bunun her zaman geçerli olmadığını unutmayın .
Eski java.util.Date sınıfından ve Joda-Time'dan farklı olarak java.time türlerinin milisaniye yerine nanosaniye çözünürlüğüne sahip olduğuna dikkat edin. Bu, java.sql.Timestamp'ın çözünürlüğü ile eşleşir.
Java.sql.Timestamp öğesinin, toString
yöntemi aracılığıyla bir dize gösterimi oluştururken JVM'nizin geçerli varsayılan saat dilimini tarih-saat değerine örtük olarak uygulama gibi kötü bir alışkanlığı olduğunu unutmayın . Burada America/Los_Angeles
saat dilimimin uygulandığını görüyorsunuz . Buna karşılık, standart ISO 8601 formatlarını kullanan java.time sınıfları daha mantıklıdır .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Konsola boşaltın.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Çalıştırıldığında.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Amerika / Montreal] = anlık: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
Bu arada, JDBC 4.2'den itibaren, java.time türlerini doğrudan kullanabilirsiniz. Gerek yok java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
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 .
Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. 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?
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time uygulamasına gelecekteki olası eklemeler için kanıtlayıcı bir zemindir. Burada bazı yararlı sınıfları gibi bulabilir Interval
, YearWeek
, YearQuarter
, ve daha .
Ayrıca şunları da yapabilirsiniz:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
API'ye göre yıl, ay vb. Kabul eden kurucu kullanımdan kaldırılmıştır. Bunun yerine, uzun kabul eden Oluşturucu kullanmalısınız. İstediğiniz tarihi oluşturmak için bir Takvim uygulaması kullanabilir ve örneğin getTimeInMillis yöntemiyle zaman temsiline uzun olarak erişebilirsiniz .
Tamlık adına , Joda-Time sürüm 2.5 ve DateTime
sınıfıyla da bir çözüm :
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
nesneye JVM'nin geçerli varsayılan saat dilimi uygulanır . Bu, sonuçlarınızın çeşitli bilgisayarlara veya ana işletim sistemi yapılandırmasına veya JVM ayarlarına göre değişeceği anlamına gelir . Tahmin edilebilir sonuçlar için o kurucuya bir saat dilimi DateTime
geçirin. Niyetinize uygun saat dilimi adını seçin . Örneğin, DateTimeZone.forID( "America/Montreal" )
veya DateTimeZone.UTC
.
DateTime
Nesneye, çağından beri geçen milisaniyesini sorun . Değiştir .toDate().getTime()
ile .getMillis()
.
DateTimeZone.getDefault()
. (Bu arada, Locale.getDefault()
isteğe bağlı argümanların belirsizliği üzerine aynı mesele.)
Daha genel bir cevap içe aktarmak olacaktır java.util.Date
, o zaman timestamp
geçerli tarihe eşit bir değer belirlemeniz gerektiğinde, basitçe olarak ayarlayın new Date()
.