2008-12-05 9 views
6

मैं डेटाबेस से एक तिथि और एक समय वापस खींच रहा हूँ। वे अलग-अलग क्षेत्रों में संग्रहित होते हैं, लेकिन मैं उन्हें java.util.Date ऑब्जेक्ट में जोड़ना चाहता हूं जो दिनांक/समय को उचित रूप से दर्शाता है।मैं java.sqil.Date ऑब्जेक्ट को java.sql.Time ऑब्जेक्ट के साथ कैसे जोड़ूं?

मेरा मूल दृष्टिकोण यहां है, लेकिन यह त्रुटिपूर्ण है। मैं हमेशा एक तिथि/समय के साथ समाप्त होता हूं जो कि 6 घंटे से कम होना चाहिए। मुझे लगता है कि ऐसा इसलिए है क्योंकि समय में टाइमज़ोन ऑफसेट के साथ-साथ तिथि भी है, और मुझे वास्तव में टाइमज़ोन ऑफसेट रखने के लिए उनमें से केवल एक की आवश्यकता है।

ऐसा करने के तरीके पर कोई सुझाव है कि यह मुझे सही दिनांक/समय देगा?

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; 
     } 

उत्तर

10

मैं दोनों का दिनांक और कैलेंडर वस्तुओं में समय डाल दिया, और उसके बाद दूसरी वस्तु से समय मान निकालें और उन्हें पहले में डाल करने के लिए विभिन्न तरीकों कैलेंडर का प्रयोग करेंगे।

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() कैलेंडर का एक नया उदाहरण हर एक फोन बनाता है। कैलेंडर बहुत भारी वजन है, और थ्रेड सुरक्षित नहीं है। हालांकि यह तकनीकी रूप से ऐसा करने का एक सही तरीका है, इसके बारे में जाने के बेहतर तरीके हैं। –

+2

यदि कोई बेहतर तरीका है तो क्या आप इसे पोस्ट कर सकते हैं? – ScArcher2

+0

ठीक है, यदि आप बहुत सारे कैलेंडर बनाने के बारे में चिंतित हैं, तो आप दिनांक के लिए एक और उस समय के लिए एक बना सकते हैं, और बस उन्हें dCal.setTime (दिनांक) और tCal.setTime (समय) के साथ रीसेट कर सकते हैं; –

5

इस प्रकार की चीजें करते समय जावा की अपनी तिथि कक्षाओं के बजाय जोडा समय का उपयोग करें। यह एक बहुत ही बेहतर तिथि/समय एपीआई है जो उस चीज को बनाता है जिसे आप बेहद आसान और भरोसेमंद करने की कोशिश कर रहे हैं।

1

मान लें कि आपको ResultSet.getTime(String, Calendar) विधि का उपयोग करने के लिए आवश्यक डेटाबेस का समय क्षेत्र जानने के लिए Calendar पर समय क्षेत्र निर्धारित किया गया है। जेडीबीसी चालक उस समय आवश्यक समायोजन करेगा।

यदि सभी कोड सर्वरसाइड चला रहे हैं तो मैं हर समय सामान्य समय क्षेत्र (शायद यूटीसी) पर मानकीकरण की सिफारिश करता हूं और जीयूआई में प्रतिपादन प्रदर्शित करते समय उचित रूप से परिवर्तित करता हूं।

मैं जोडाटाइम (http://joda-time.sourceforge.net) का भी उपयोग करता हूं, यह आपको भविष्य में सिरदर्द बचाएगा।

4

@Paul TomblinTimeZone समस्या को नियंत्रित करने का एक निश्चित तरीका है, और मुझे पता था कि कोई मिश्रण में "जोडा टाइम" फेंकने वाला था।

हैं:

अपने आवेदन में एक ही TimeZone में कार्यान्वित हैं के रूप में डीबी में डिफ़ॉल्ट है, तो आपको निम्न के साथ भाग प्राप्त करने में सक्षम हो सकता है: अन्य उत्तर सभी अच्छे और निम्न हैक की तुलना में अधिक मजबूत होते हैं आप यह चरण छोड़:

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

और की तरह सीधे java.sql.Time मान का उपयोग,:

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

करने के लिए रूपांतरण डिफ़ॉल्ट TimeZone पेश नहीं किया जाएगा - java.sql.Time में संग्रहीत मूल्य होना चाहिए।

YMMV, चेतावनी एम्प्टर, आदि ...

संबंधित मुद्दे