2009-07-01 62 views
59

ile Joda-Time kullanmak nasıl prepared statementzaman bir <a href="http://en.wikipedia.org/wiki/PostgreSQL" rel="noreferrer">PostgreSQL</a> veritabanında tip <a href="http://www.postgresql.org/docs/current/static/datatype-datetime.html" rel="noreferrer">Timestamp</a> olduğu durumlarda java.sql.Timestamp

INSERT INTO mst(time) VALUES (?); 

var.
Bir Joda-TimeDateTime nesnesini ekliyorum ya da çalışıyorum demeliyim. DateTime nesnesini java.sql.Timestamp'a dönüştürmenin bir yolunu bulamıyorum. Joda-Time belgelerini okudum ve bunun referansını görmedim.

Teşekkürler.

cevap

84

Bir Joda DateTime ürününü ilk önce uzun bir süreye (çağdan sonra millis) dönüştürebilir ve bundan sonra bir Zaman Damgası oluşturabilirsiniz.

DateTime dateTime = new DateTime(); 
Timestamp timeStamp = new Timestamp(dateTime.getMillis()); 
+6

TimeZone bileşeni nerede? Tarih ve saati sadece "kopyaladınız" ancak gerçek değeri etkileyebilecek zaman dilimini değil. –

+5

Ne demek istediğimi açıklayabilir misiniz? dateTime.getMillis(), zaman dilimini dikkate alan epoch'tan beri milisaniye döndürür. –

+6

Jota-time'ın nanosaniye saklamadığı, Timestamp'ın yaptığı gibi. Bu ikisi arasındaki herhangi bir dönüşüm nanosaniye hassasiyetini kaybeder. – Gili

9

JodaTime'in DateTime kurucusu bunu sizin için halledebilir. (ı soru ne zaman gönderildiğini bu doğru olsaydı emin değilim, ama ben daha yeni çözüm eklemek düşündüm bu yüzden bir üst Google sonucu.)

birkaç API seçenekleri vardır:

public DateTime(Object instant); 
public DateTime(Object instant, DateTimeZone zone); 

Her iki seçenek de java.sql.Timestamp öğesini kabul eder, çünkü java.util.Date öğesini genişletir, ancak DateSpace ve Date öğesinin yalnızca milisaniye çözünürlüğü * olduğundan Nanosaniye'ler yoksayılır (zeminli). Belirli bir saat dilimi olmadan, DateTimeZone.UTC varsayılan olacaktır.

< Didaktik Mod >
"Çözünürlük" kaç basamak sağlandığını gösterir. "Hassas", temsilin ne kadar doğru olduğu. Örneğin, MSSQL'in DateTime, milisaniye çözünürlüğüne sahiptir, ancak yalnızca ikinci hassasiyetin 1/3'ü kadardır (DateTime2, değişken çözünürlüğe ve daha yüksek hassasiyete sahiptir).
</Didaktik Modu >

UTC zaman damgası milisaniyesinde Çözünürlük Örnek:

new DateTime(resultSet.getTimestamp(1)); 

o zaman java.sql.Timestamp kullanamaz veritabanınızda TIME ZONE İLE ZAMAN kullanıyorsanız, çünkü Saat dilimlerini desteklemiyor. ResultSet # getString kullanmanız ve dizeyi ayrıştırmanız gerekecek. İkinci ebatları, Örnek ile Zaman Dilimi (biçim ofset) ile

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .parseDateTime(resultSet.getString(1)); 

Zaman Damgası: İkinci ebatları, Örnek ** ile

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .parseLocalDateTime(resultSet.getString(1)); 

UTC Zaman Damgası: İkinci ebatları, Örnek ** ile Zaman Dilimi olmayan

zaman damgası **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z") 
    .parseDateTime(resultSet.getString(1)); 

Bonus: DateTimeFormat # forPattern statik ally önbellekleri parsers'a göre böylelikle yapmanız gerekmez.

< Didaktik Modu >
Genellikle çözünürlük açık hale ve ara nesneleri üreten önlemek için lütfen DBO modelinde bir dize kullanarak önerilir. (2013-11-14 09:55:25 2013-11-14 09: 55: 25.000'e eşit midir?)) Genellikle veri koruma endişeleri için optimize edilen "veritabanı modeli nesneleri" ve "iş modeli nesneleri" arasında bir dönüşüm/haritalama katmanı ile hizmet seviyesi kullanımı için optimizasyon yapmaya çalışıyorum. CRUD tabanlı DAO'ların iş nesnelerini doğrudan öncelikleri bir araya getirme eğiliminde olduğunu ve kaçırılmayan kenar durumları nedeniyle beklenmedik yerlerden istisnalar atmadıklarını düşünüyorum. Açık bir dönüştürme katmanına sahip olmak, veri kaynağını denetlemiyormuş gibi, gerekirse doğrulama eklemenize de olanak tanır. Endişeleri ayırmak ayrıca her bir katmanı bağımsız olarak test etmeyi kolaylaştırır.
</Didaktik Modu >

* iş modelinde nanosaniye çözünürlüğe çözmek için gerekirse farklı bir kütüphaneyi kullanmak gerekecek.

** Zaman damgası Dize biçimi, veritabanları arasında değişebilir, emin değil.

+0

Nanosaniye ile ilgili olarak… FYI, [JSR 310: Tarih ve Zaman API'si] (http://jcp.org/en/jsr/detail?id=310), Java 8 ve Joda-Time'ın halefi olarak yapılandırılmıştır. çözüm. Birçok bilgisayarın saatinin bu ayrıntılara zaman ayırmadığını unutmayın. Yanında: JSR özelliklerinden ilginç bir not: * Bu sınıflar nanosaniye hassasiyetini kullanır. Sınıflar, evrenin şu andaki yaşı içinde herhangi bir nanosaniye anlıkını temsil etmek için yeterli doğruluğa sahiptir. * –

+0

Bu yazımdaki diksiyonu düzeltebilmelerini diliyorum ... Java, donanımın hassasiyeti üzerinde hiçbir kontrole sahip değildir ve doğruluk, hassasiyetin bir işlevidir ve doğruluk (veya 'doğruluk').Sınıflar nanosaniye ÇÖZÜNÜRLÜĞÜ ve çok büyük miktarda nanosaniye temsil etmek için bellekte yeterli büyüklüktedir. – KarlKFI

+0

Ayrıntıya ilişkin iddianızla ilgili olarak: bazı sistemlerde nanosaniye çözünürlüğü yoktur ve bazılarında nanosaniye basısı veya doğruluğu yoktur. System.nanoTime() muhtemelen işletim sisteminin nanosaniye çözünürlüğü sağlamadığı, ancak yalnızca çözünürlük, doğruluk, doğruluk veya doğruluk artırmadığı herhangi bir sisteme sıfırlar ekler. İşte terminolojide bulabildiğim en kapsamlı kaynak: http://www.tutelman.com/golf/measure/precision.php – KarlKFI

İlgili konular