Java.util को कैसे बदलें। java.sql.Date को कैसे बदलें?


453

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

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


आप एक ऐसा ही मुद्दा यहां पर देख सकते हैं stackoverflow.com/questions/12131068/…
Lem

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

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

2
मैं वास्तव में '09 में बारीकियों से अवगत नहीं था, और चूंकि यह प्रश्न इतना लोकप्रिय है, इसलिए मैंने स्वीकार किए गए उत्तर को एक में बदल दिया है जो अधिक आधुनिक और पूर्ण दोनों है। सहयोग के लिए आप सभी का धन्यवाद!
डेविड एकरमैन 15

जवाबों:


89

tl; डॉ

Java.util को कैसे बदलें। java.sql.Date को कैसे बदलें?

मत करो। दोनों ही वर्ग बहिष्कृत हैं।

  • विरासत के बजाय jD.time कक्षाओं का उपयोग करें java.util.Dateऔर java.sql.DateJDBC 4.2 या उसके बाद के साथ।
  • / से java.time में कनवर्ट करें यदि कोड के साथ इंटर-संचालन अभी तक 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.
)

प्रतिस्थापन:

  • Instantjava.util.Date
    दोनों के बजाय UTC में एक पल का प्रतिनिधित्व करते हैं। लेकिन अब मिलीसेकंड के बजाय नैनोसेकंड के साथ।
  • LocalDatejava.sql.Date
    दोनों के बजाय दिन के समय के बिना और समय क्षेत्र के बिना केवल तारीख का प्रतिनिधित्व करते हैं।

विवरण

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

जावा में दिनांक-समय प्रकार की तालिका (दोनों विरासत और आधुनिक) और SQL मानक में।

java.time

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

एक SQL डेटा प्रकार DATE केवल दिनांक के लिए होता है, जिसमें कोई समय नहीं होता है और कोई समय क्षेत्र नहीं होता है। जावा में कभी भी ऐसी कक्षा a तक नहीं थी java.time.LocalDatecreate जब तक कि जावा में create नहीं है। आइए एक विशेष समय क्षेत्र के अनुसार आज की तारीख प्राप्त करके ऐसा मान बनाएं (समय क्षेत्र एक तिथि निर्धारित करने में महत्वपूर्ण है क्योंकि मॉन्ट्रियल की तुलना में पहले पेरिस में एक नए दिन की शुरुआत होती है) उदाहरण)।

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 ड्राइवर के साथ अनुपालन JDBC 4.2 कल्पना , आप एक पारित करने के लिए सक्षम होना चाहिए LocalDateके माध्यम से setObjectएक पर PreparedStatementएक एसक्यूएल, DATE क्षेत्र में दुकान करने के लिए।

myPreparedStatement.setObject( 1 , localDate );

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

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

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

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

Java.sql.Date में कनवर्ट करें

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

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

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

LocalDate localDate = sqlDate.toLocalDate();

से परिवर्तित कर रहा है java.util.Date

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

Instantकक्षा के माध्यम से जाएं , जो यूटीसी में समय पर एक क्षण का प्रतिनिधित्व करता है। एक Instantविचार में एक के समान है java.util.Date। लेकिन ध्यान दें कि नैनोसेकंडInstant तक रिज़ॉल्यूशन होता है जबकि केवल मिलीसेकंड होता हैjava.util.Date रिज़ॉल्यूशन होता है।

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

Instant instant = myUtilDate.toInstant();

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

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

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


जावा के बारे में

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, औरSimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

जावा या एंड्रॉइड के किस संस्करण के साथ उपयोग करने के लिए java.time लाइब्रेरी की तालिका

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


478

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

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


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

1
@ डेविड एकरमैन ..... इस विधि के epochsecondsबाद मिलीसेकंड की वापसी होती है 1,JAN,1970। लेकिन क्या होगा अगर हम इस तारीख से पहले किसी व्यक्ति की तारीख को स्टोर करना चाहते हैं .... या ऐसा कुछ0000-00-00 as default
अर्जुन केपी

31
मेरे मामले में सही उत्तर है <code> java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp (useDate.getTime ()); </ code>, क्योंकि यह समय क्षेत्र को रोकता है।
अल्बर्टो डी पाओला

2
@ वायर्ड00 हां, जावा के शुरुआती संस्करणों के साथ बंडल किए गए पुराने डेट-टाइम क्लासेज एक गड़बड़ हैं , जिन्हें कुछ क्रूड हैक्स सहित बुरी तरह से डिजाइन किया गया है। जब भी संभव हो, जावा 8 और बाद में नए java.time ढांचे का उपयोग करने का प्रयास करें । ये नई कक्षाएं पुराने को दबा देती हैं। Java.time कक्षाएं और पुरानी कक्षाओं में आगे और पीछे परिवर्तित करने के लिए कुछ सुविधा विधियाँ हैं - उपयोगी जब तक हम JDBC ड्राइवरों का इंतजार करते हैं कि वे नए java.time प्रकारों को सीधे उपयोग करने के लिए अपडेट किए जाते हैं।
बेसिल बोर्के

1
@ wired00 java.time का उपयोग करने के लिए इस प्रश्न पर मेरा नया उत्तर देखें । इसके अलावा कई और उदाहरण के लिए StackOverflow खोजें।
बेसिल बोर्ख

39

अन्य उत्तर के साथ आपको समय की जानकारी के साथ परेशानी हो सकती है (अप्रत्याशित परिणामों के साथ तारीखों की तुलना करें!)

मैं सुझाव देता हूँ:

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 का उपयोग कर रहा है, तो उस समय की जानकारी को काट दिया जाएगा। आपने मेरी राय में समाधान को समाप्त कर दिया है।
दारियो

4
हां, शायद मैंने ऐसा किया। मुझे कभी-कभी java.sql.Data की तुलना वर्तमान तारीख से करनी चाहिए और यह सबसे अच्छा तरीका है। मुझे उम्मीद है कि यह मदद कर सकता है।
मौरेटो

FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

बेशक, यह विषय लगभग 10 साल पहले था, प्री-जावा 8.
मौरेटो

26

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

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

18

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

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

अधिक जानकारी के लिए, आप इस प्रश्न को देख सकते हैं ।


16

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

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

जहां उठाया JXDatePicker की वस्तु है


5

यह फ़ंक्शन java दिनांक ऑब्जेक्ट से परिवर्तित 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

अपना java.util फ़ॉर्मेट करें। पहले। फिर 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);

2

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

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)

2

मैं एक नौसिखिया हूँ: इस काम के आसपास बहुत दौड़ने के बाद। सोचा उपयोगी हो सकता है

     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

FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बॉर्क

2
java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

यहाँ javaDate java.util.Date का उदाहरण है


1
यह वास्तव में डेविड एकरमैन, चेतन और तन्मय कुमार शॉ के जवाबों की तुलना में कुछ भी नया नहीं लगता है, क्या ऐसा होता है?
ओले वीवी

1

2 तिथियों की तुलना करने की विधि (use.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;
}

0

इसके साथ प्रयास करें

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

-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चर को SQL तालिका में सम्मिलित करना चाहते हैं तो आप कर सकते हैं:

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

1
यह अनिवार्य रूप से वैसा ही प्रतीत होता है जैसा कि इस उत्तर ने एक वर्ष पहले पोस्ट किया था।
बर्नहार्ड बार्कर

-3

मैं निम्नलिखित कोड का उपयोग कर रहा हूँ कृपया इसे आज़माएं

DateFormat fm= new SimpleDateFormatter();

उदाहरण के लिए इच्छित तिथि का प्रारूप निर्दिष्ट करें "DD-MM_YYYY"या 'YYYY-mm-dd' फिर जावा तिथि डेटा प्रारूप का उपयोग करें

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

तो यह आपकी तारीख को पार्स करेगा


-3

आप इस पद्धति का उपयोग उपयोग तिथि को sql दिनांक में परिवर्तित करने के लिए कर सकते हैं,

DateUtilities.convertUtilDateToSql(java.util.Date)

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

-4

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

java.util.Date useDate = new java.util.Date ();
java.sql.Date sqlDate = new java.sql.Date (careDate);


-8

यदि आप हमारे हैं तो मैसूर को एक तारीख स्तंभ कहा जा सकता है जो इस तिथि का स्ट्रिंग प्रतिनिधित्व है

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

यहाँ कोड चित्रण है:

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

स्ट्रिंग तिथि = ConvertUtilDateToSqlDate (otherTransaction.getTransDate ());

// तो आप sql स्टेटमेंट में इस तारीख को पास करें


14
Stackoverflow में आपका स्वागत है, मेरे पास आपके उत्तर के लिए कुछ टिप्पणियां हैं। सवाल था "java.util.Date to java.sql.Date कैसे कन्वर्ट करें"। आपने जिस कोड को प्रारूपित किया है वह एक java.util है। yyyy-MM-dd के रूप में। यह वास्तव में इस संदर्भ में सीमित उपयोग है क्योंकि आपको java.sql पास करना चाहिए। सीधे स्ट्रिंग के रूप में करने के बजाय jdbc ड्राइवरों पर जाएं।
जूनो २५'१२
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.