2008-12-05 14 views
6

Veritabanından bir Tarih ve Zaman geri çekiyorum. Ayrı alanlarda depolanırlar, ancak bunları tarih/saati uygun şekilde yansıtan bir java.util.Date nesnesinde birleştirmek isterim.Bir java.util.Date nesnesini bir java.sql.Time nesnesiyle nasıl birleştiririm?

İşte benim özgün yaklaşımım, ancak kusurlu. Her zaman olması gereken 6 saat olan bir Tarih/Saat ile sona ererim. Sanırım bunun nedeni, Zaman'ın Tarih'in yanı sıra bir zaman dilimi ofsetine sahip olması ve sadece bir saat dilimi ofsetine sahip olmak için bunlara ihtiyacım var.

Bunu nasıl yapacağınıza dair herhangi bir öneride bulunarak bana doğru tarih/saati verecek?

import java.sql.Time; 
import java.util.Calendar; 
import java.util.Date; 

import org.apache.commons.lang.time.DateUtils; 
    public static Date combineDateTime(Date date, Time time) 
     { 
      if (date == null) 
       return null; 
      Date newDate = DateUtils.truncate(date, Calendar.DATE); 
      if (time != null) 
      { 
       Date t = new Date(time.getTime()); 
       newDate = new Date(newDate.getTime() + t.getTime()); 
      } 
      return newDate; 
     } 

cevap

10

Ben Tarih ve Takvim nesnelerin içine Saat hem koymak ve sonra ikinci nesneden zaman değerlerini ayıklamak ve ilk içine koymak için çeşitli Takvim yöntemlerini kullanmak.

Calendar dCal = Calendar.getInstance(); 
    dCal.setTime(date); 
    Calendar tCal = Calendar.getInstance(); 
    tCal.setTime(time); 
    dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY)); 
    dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE)); 
    dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND)); 
    dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND)); 
    date = dCal.getTime(); 
+0

Calendar.getInstance() Takvim yeni bir örneğini her çağrı oluşturur. Takvim çok ağırdır ve iş parçacığı güvenli değildir. Bu teknik olarak bunu yapmak için doğru bir yol olsa da, bu konuda gitmenin daha iyi yolları vardır. –

+2

Daha iyi bir yol varsa, lütfen postayla gönderebilir misiniz? – ScArcher2

+0

Çok fazla Takvim oluşturmayla ilgili endişeleriniz varsa, tarih bölümü için bir tane ve bu süre için bir tane oluşturabilir ve bunları yalnızca dCal.setTime (tarih) ve tCal.setTime (zaman) ile sıfırlayabilirsiniz; –

5

Bu tür şeyler yaparken, Java'nın kendi Date sınıfları yerine Joda Time'ı kullanın. Bu, son derece kolay ve güvenilir yapmaya çalıştığınız şeyleri yapan çok üstün bir tarih/zaman api.

1

Veritabanından okunan zamanın saat dilimini bildiğinizi varsayarak, Calendar üzerinde saat dilimini önceden ayarlamış olan ResultSet.getTime(String, Calendar) yöntemini kullanmanız gerekir. JDBC sürücüsü, zamana göre gerekli ayarları yapacaktır.

Tüm kodlar sunucu tarafında çalışıyorsa, tüm zamanlar için ortak saat dilimini (muhtemelen UTC) standartlaştırmanızı ve GUI'de görüntüyü görüntülerken uygun şekilde dönüştürmeyi öneririm.

Ayrıca JodaTime (http://joda-time.sourceforge.net) kullanmak istiyorum, gelecekte baş ağrısı olacak.

4

@Paul TomblinTimeZone sorununu denetlemenin doğru bir yoludur ve birinin "Joda Time" ı miksere atacağını biliyordum.

ise: DB varsayılan olarak uygulama aynı TimeZone içinde yürütür

, aşağıdaki ile kurtulmak mümkün olabilir: diğer cevaplar tüm iyi ve şu hack daha sağlamdır Bu adımı atlamak:

Date t = new Date(time.getTime()); 

ve benzeri doğrudan java.sql.Time değeri kullanın:

newDate = new Date(newDate.getTime() + time.getTime()); 

dönüşüm varsayılan TimeZone eklenmeyecek - java.sql.Time saklanan değeri içermelidir.

YMMV, sorumluluğun alıcıya, vb ...

İlgili konular