2009-02-09 13 views
369

मैं इनपुट के रूप में java.util.Date का उपयोग करने और उसके साथ एक क्वेरी बनाने का प्रयास कर रहा हूं - इसलिए मुझे java.sql.Date की आवश्यकता है।java.util.Date से java.sql.Date को परिवर्तित करने के लिए कैसे?

मुझे आश्चर्य हुआ कि यह रूपांतरण को स्पष्ट रूप से या स्पष्ट रूप से नहीं कर सका - लेकिन मुझे यह भी नहीं पता कि मैं यह कैसे करूंगा, क्योंकि जावा एपीआई अभी भी मेरे लिए काफी नया है।

+0

आप ने वही समस्या यहां पा सकते हैं JXDatePicker की वस्तु है http://stackoverflow.com/questions/12131068/error-casting-java-util-date -into-java-sql-date – Lem

+0

मेरे लिए, यह निकला कि मुझे बदलने के लिए जरूरी नहीं था। मेरे कोड में एक 'आयात java.sql। * 'था, java.util.date को ओवरराइड करना और इस प्रकार दिनांक मूल्यों को असाइन करते समय परेशानी उत्पन्न हुई जो बाद वाले के साथ ठीक थी लेकिन पहले नहीं। एचटीएच – HumanInDisguise

+1

@ डेविड एकरमैन क्या आप समझते हैं कि एक java.util.Date एक तारीख * और * एक दिन का दिन है, लेकिन एक java.sql.Date केवल एक तारीख * बिना * दिन है? (असल में समय-समय पर होता है लेकिन इसे अनदेखा किया जाता है, क्लास डिज़ाइन का खराब हैक) एसक्यूएल में, 'DATE' का मतलब केवल दिनांक है। –

उत्तर

26

tl; डॉ

  • उपयोग java.time विरासत java.util.Date & JDBC 4.2 या बाद के साथ java.sql.Date के बजाय वर्गों।
  • जावा के समय में कनवर्ट करें यदि कोड के साथ इंटर-ऑपरेटिंग अभी तक java.time में अपडेट नहीं किया गया है।

उदाहरण क्वेरी PreparedStatement के साथ क्वेरी।

myPreparedStatement.setObject( 
    … ,           // Specify the ordinal number of which argument in SQL statement. 
    myJavaUtilDate.toInstant()     // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC). 
     .atZone(ZoneId.of("Africa/Tunis")) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`. 
     .toLocalDate()       // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object. 
) 

विवरण

आप तारीख-केवल मूल्यों (कोई समय दिन-का-, कोई समय क्षेत्र) के साथ काम करने की कोशिश कर रहे हैं, तो java.util.Date बजाय LocalDate वर्ग का उपयोग करें।

java.time

जावा 8 में और बाद में, परेशानी पुराने तिथि-समय जावा के प्रारंभिक संस्करणों के साथ बंडल कक्षाएं नए java.time package द्वारा का स्थान ले लिया गया है। Oracle Tutorial देखें। अधिकांश कार्यक्षमता को जावा 6 & 7 में ThreeTen-Backport में बैक-पोर्ट किया गया है और आगे ThreeTenABP में एंड्रॉइड को अनुकूलित किया गया है।

SQL data typeDATE केवल तारीख के लिए, समय-समय पर और समय क्षेत्र के साथ ही होना चाहिए। जावा 8 में java.time.LocalDate तक जावा इतनी कक्षा कभी नहीं थी। चलिए आज की तारीख को किसी विशेष समय क्षेत्र के अनुसार प्राप्त करके इस तरह का मूल्य बनाते हैं (मॉन्ट्रियल की तुलना में पेरिस में पहले एक नए दिन के रूप में दिनांक निर्धारित करने में समय क्षेत्र महत्वपूर्ण है, उदाहरण के लिए)।

LocalDate todayLocalDate = LocalDate.now(ZoneId.of("America/Montreal")); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST". 

इस बिंदु पर, हम किया जा सकता है। यदि आपका JDBC driverJDBC 4.2 spec का अनुपालन करता है, तो आपको LocalDatesetObject पर SQL दिनांक फ़ील्ड में संग्रहीत करने में सक्षम होना चाहिए।

myPreparedStatement.setObject(1 , localDate); 

इसी तरह, ResultSet::getObject का प्रयोग कर एक जावा LocalDate ऑब्जेक्ट में एक एसक्यूएल तिथि कॉलम से ला नहीं सके। दूसरे तर्क में कक्षा निर्दिष्ट करना आपका कोड type-safe बनाता है।

LocalDate localDate = ResultSet.getObject(1 , LocalDate.class); 

दूसरे शब्दों में, इस पूरे प्रश्न या बाद में JDBC 4.2 के तहत अप्रासंगिक है।

यदि आपका जेडीबीसी ड्राइवर इस तरीके से प्रदर्शन नहीं करता है, तो आपको java.sql प्रकारों में कनवर्ट करने के लिए वापस गिरने की आवश्यकता है।

, java.sql.Date

में बदलें परिवर्तित करने के लिए नए तरीकों वर्ष तिथि-समय वर्गों को जोड़ा गया का उपयोग करें। LocalDate को परिवर्तित करने के लिए हम java.sql.Date.valueOf(…) पर कॉल कर सकते हैं।

java.sql.Date sqlDate = java.sql.Date.valueOf(todayLocalDate); 

और दूसरी दिशा में जा रहा है।

LocalDate localDate = sqlDate.toLocalDate(); 

से java.util.Date

परिवर्तित आप पुराने तिथि-समय वर्गों का उपयोग करने से बचना चाहिए, तब तक आप जब मौजूदा कोड के साथ काम करने के लिए मजबूर किया जा सकता है। यदि ऐसा है, तो आप java.time से/में कनवर्ट कर सकते हैं।

Instant कक्षा के माध्यम से जाएं, जो यूटीसी में समयरेखा पर एक पल का प्रतिनिधित्व करता है। एक Instantjava.util.Date के विचार में समान है। लेकिन ध्यान दें कि Instant में nanoseconds तक एक संकल्प है जबकि java.util.Date में केवल milliseconds संकल्प है।

परिवर्तित करने के लिए, पुराने वर्गों में जोड़े गए नए तरीकों का उपयोग करें। उदाहरण के लिए, java.util.Date.from(Instant) और java.util.Date::toInstant

Instant instant = myUtilDate.toInstant(); 

दिनांक निर्धारित करने के लिए, हमें समय क्षेत्र के संदर्भ की आवश्यकता है। किसी भी क्षण के लिए, समय क्षेत्र द्वारा तिथि दुनिया भर में बदलती है। ZonedDateTime प्राप्त करने के लिए ZoneId लागू करें।

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

† java.sql.Date वर्ग तारीख-केवल एक समय दिन-का-बिना होने का दिखावा लेकिन वास्तव में एक समय के दिन, एक आधी रात के समय के लिए समायोजित करता है। भ्रामक? हां, पुराने डेट-टाइम क्लासेस एक गड़बड़ हैं।

421

कोई बात नहीं ....

public class MainClass { 

    public static void main(String[] args) { 
    java.util.Date utilDate = new java.util.Date(); 
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
    System.out.println("utilDate:" + utilDate); 
    System.out.println("sqlDate:" + sqlDate); 

    } 

} 

यह बताते हैं। लिंक http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

+33

यह एक स्पष्ट रूपांतरण नहीं है! जावाडोक से: "यदि दिए गए मिलीसेकंड मान में समय की जानकारी होती है, तो ड्राइवर डिफ़ॉल्ट समय क्षेत्र (जावा वर्चुअल मशीन के समय क्षेत्र को चलाने वाले समय क्षेत्र) में समय घटकों को निर्धारित करेगा जो शून्य जीएमटी के अनुरूप है।" तो इससे कोई फर्क नहीं पड़ता कि आपके java.util.Date पर आपका समय क्या है, इसे 00:00:00 के रूप में कॉलम में डेटा प्रकार के साथ सेट किया जाएगा। –

+1

@ डेविड एकरमैन ..... यह विधि '1, जनवरी, 1 9 70 के बाद 'एपोकसेकंड' i.e मिलीसेकंड लौटाती है। लेकिन क्या होगा यदि हम इस तिथि से पहले किसी व्यक्ति की तारीख को स्टोर करना चाहते हैं .... या कुछ '0000-00-00 जैसे डिफ़ॉल्ट' –

+28

मेरे मामले में सही उत्तर java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(utilDate.getTime()); है, क्योंकि यह समय फ़ील्ड को संरक्षित करता है। –

36
अन्य जवाब आप समय की जानकारी के साथ मुसीबतों हो सकता है के साथ

है

मेरा सुझाव है (अप्रत्याशित परिणामों के साथ तिथियों की तुलना करें!):

java.util.Calendar cal = Calendar.getInstance(); 
java.util.Date utilDate = new java.util.Date(); // your util date 
cal.setTime(utilDate); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0);  
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date 
System.out.println("utilDate:" + utilDate); 
System.out.println("sqlDate:" + sqlDate); 
+5

यदि वह किसी डेटाबेस में दिनांक कॉलम के लिए java.sql.Date का उपयोग कर रहा है, तो उस समय की जानकारी को छोटा कर दिया जाएगा। आपने मेरी राय में समाधान को अतिरंजित किया है। – darioo

+4

हाँ, शायद मैंने इसे किया। मुझे कभी-कभी java.sql.Data की तुलना वर्तमान दिनांक के साथ करने की आवश्यकता होती है और इमो यह सबसे अच्छा तरीका है। मुझे उम्मीद है कि यह मदद कर सकता है। – mauretto

-8

आप Mysql एक तारीख usgin रहे हैं कॉलम को इस तिथि का एक स्ट्रिंग प्रतिनिधित्व

इसलिए मैं इसे प्रारूपित करने के लिए डेटफॉर्मर क्लास का उपयोग कर रहा हूं और फिर इसे एसक्यूएल स्टेटमेंट में स्ट्रिंग के रूप में सेट कर सकता हूं या तैयार कथन

,210

यहाँ कोड उदाहरण है:

private String converUtilDateToSqlDate(java.util.Date utilDate) { 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    String sqlDate = sdf.format(utilDate); 
    return sqlDate; 
} 

स्ट्रिंग तारीख = converUtilDateToSqlDate (otherTransaction.getTransDate());

// तो इस तिथि आप में एसक्यूएल बयान 2 तारीखों की तुलना के लिए

+12

स्टैक ओवरफ्लो में आपका स्वागत है, मेरे पास आपके उत्तर में कुछ टिप्पणियां हैं। सवाल यह था कि "java.sutil.Date को java.sql.Date में कैसे परिवर्तित करें"। आपके द्वारा चिपका गया कोड java.util.Date को yyyy-MM-dd के रूप में स्वरूपित करता है। यह वास्तव में इस संदर्भ में सीमित उपयोग का है क्योंकि आपको java.sql.Date को सीधे स्ट्रिंग के रूप में करने के बजाय jdbc ड्राइवरों को पास करना चाहिए। – jontro

1

विधि (util.date या sql.date)

public static boolean isSameDay(Date a, Date b) { 
    Calendar calA = new GregorianCalendar(); 
    calA.setTime(a); 

    Calendar calB = new GregorianCalendar(); 
    calB.setTime(b); 

    final int yearA = calA.get(Calendar.YEAR); 
    final int monthA = calA.get(Calendar.MONTH); 
    final int dayA = calA.get(Calendar.DAY_OF_YEAR); 

    final int yearB = calB.get(Calendar.YEAR); 
    final int monthB = calB.get(Calendar.MONTH); 
    final int dayB = calB.get(Calendar.DAY_OF_YEAR); 

    return yearA == yearB && monthA == monthB && dayA == dayB; 
} 
2

यहाँ Sql तारीख को util तिथि परिवर्तित करने की उदाहरण और पारित या यह एक उदाहरण है जो मैं अपने प्रोजेक्ट में उपयोग कर रहा हूं वह भी आपके लिए उपयोगी हो सकता है।

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj) 
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date) 
0

मैं निम्नलिखित कोड का उपयोग कर रहा यह पता करने का प्रयास करें

DateFormat fm= new SimpleDateFormatter(); 

तारीख का स्वरूप आप उदाहरण "DD-MM_YYYY" या 'YYYY-mm-dd' के लिए चाहते तो का उपयोग निर्दिष्ट इस

public static String toMysqlDateStr(Date date) { 
    String dateForMySql = ""; 
    if (date == null) { 
     dateForMySql = null; 
    } else { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     dateForMySql = sdf.format(date); 
    } 

    return dateForMySql; 
} 
-3

के साथ प्रयास करें जावा तिथि डेटाटाइप

fm.format("object of java.util.date"); 

तो यह आपकी तिथि

19

यह फ़ंक्शन जावा दिनांक ऑब्जेक्ट से एक परिवर्तित SQL दिनांक लौटाएगा।

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) { 
    return new java.sql.Date(date.getTime()); 
} 
5

यह फ़ंक्शन जावा डेट ऑब्जेक्ट से एक परिवर्तित SQL दिनांक वापस कर देगा।

public static java.sql.Date convertFromJAVADateToSQLDate(
      java.util.Date javaDate) { 
     java.sql.Date sqlDate = null; 
     if (javaDate != null) { 
      sqlDate = new Date(javaDate.getTime()); 
     } 
     return sqlDate; 
    } 
-3

आप इस विधि का उपयोग कर सकते हैं एसक्यूएल तारीख को util तारीख कन्वर्ट करने के लिए,

DateUtilities.convertUtilDateToSql(java.util.Date) 
+0

मानक जावा लाइब्रेरी में कोई डेट यूटिलिटी क्लास नहीं है (और मैं इस विधि को त्वरित Google खोज से कहीं भी नहीं ढूंढ सकता)। यदि यह एक विशिष्ट पुस्तकालय से है, तो आप शायद इतना कहना चाहें और दस्तावेज़ों के लिए एक लिंक शामिल कर सकते हैं। – Dukeling

15

परिवर्तित java.util.Datajava.sql.Data के घंटे, मिनट और सेकंड खो जाएगा। तो अगर यह संभव है, मैं सुझाव है कि आप इस तरह java.sql.Timestamp का उपयोग करें:

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime())); 

अधिक जानकारी के लिए, आप जाँच कर सकते हैं this question

3

अपने java.util.Date को पहले प्रारूपित करें। तब java.sql.Date में तारीख पाने के लिए स्वरूपित तारीख का उपयोग

java.util.Date utilDate = "Your date" 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
final String stringDate= dateFormat.format(utilDate); 
final java.sql.Date sqlDate= java.sql.Date.valueOf(stringDate); 
-1

मुझे लगता है कि सबसे अच्छा तरीका है कन्वर्ट करने के लिए है:

static java.sql.Timestamp SQLDateTime(Long utilDate) { 
    return new java.sql.Timestamp(utilDate); 
} 

Date date = new Date(); 
java.sql.Timestamp dt = SQLDateTime(date.getTime()); 

आप एक एसक्यूएल तालिका में dt चर सम्मिलित करना चाहते हैं, तो आप कर सकते हैं:

insert into table (expireAt) values ('"+dt+"'); 
+0

यह अनिवार्य रूप से वही है जैसा कि [इस उत्तर] (https://stackoverflow.com/a/31237429/1711796) एक साल पहले पोस्ट किया गया था। – Dukeling

1

मैं एक नौसिखिया हूं: इस काम के आसपास बहुत अधिक चलने के बाद। विचार उपयोगी हो सकता है

 String bufDt = bDOB.getText(); //data from form 
    DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format 
    Date bbdt = (Date)dF.parse(bufDt); // string data is converted into java util date 
    DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date 
    String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date 
    java.sql.Date sqlDate= java.sql.Date.valueOf(ndt); // finally data from the form is convered to java sql. date for placing in database 
-3

मैं निम्नलिखित कोडिंग का प्रयास कर रहा था जो ठीक काम करता था।

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date (utilDate);

7

JXDatePicker (जावा कैलेंडर) से चुनने की तारीख के मामले में और इसे SQL दिनांक प्रकार के रूप में डेटाबेस में संग्रहीत करने के मामले में, नीचे ठीक काम करता है ..

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

जहां pickedDate

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