कन्वर्ट java.time। Java.util.Date प्रकार में लिखें


372

मैं टाइप java.time.LocalDateमें बदलना चाहता हूं java.util.Date। क्योंकि मैं तारीख निर्धारित करना चाहता हूं JDateChooser। या कोई तारीख चयनकर्ता है जो java.timeतारीखों का समर्थन करता है?


1
क्या आपने stackoverflow.com/questions/21242110/… पढ़ा है ?
दक्ष शाह

2
LGoodDatePicker मूल रूप से java.time पैकेज (उर्फ जावा 8 समय, या JSR-310) का उपयोग करता है। विशेष रूप से, LGoodDatePicker दिनांक मानों को संग्रहीत करने के लिए "java.time.LocalDate" का उपयोग करता है। स्क्रीनशॉट और डेमो प्रोजेक्ट होमपेज पर हैं
BlakeTNC

जवाबों:


560
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

यह मानता है कि आपकी तिथि चयनकर्ता तारीखों को तार में बदलने के लिए सिस्टम डिफ़ॉल्ट टाइमज़ोन का उपयोग करता है।


जेबी निज़ेट शायद जावा 8 विकास / रिलीज के शुरुआती चरण में था और @ user3509494 किसी तरह इसका परीक्षण कर रहा था।
रसेलहॉफ़

2
क्या इससे बचना संभव है atStartOfDay(), क्योंकि यह तारीख के मूल्य को बदल देता है, जैसा कि मैं इसे समझता हूं।
yegor256

1
@JBNizet आपके जवाब से मुझे कोई मतलब नहीं है, इसीलिए मैंने स्पष्ट करने का फैसला किया। आप बेकार टिप्पणी करने के बजाय इसे स्पष्ट क्यों नहीं करते?
१०:२५

12
क्योंकि मैं नहीं देखता कि कैसे और क्यों इसे किसी भी स्पष्टीकरण की आवश्यकता होगी। 232 लोगों ने इस जवाब को गलत ठहराया, इस प्रकार यह स्पष्ट है। आप कहते हैं कि atStartOfDay दिनांक का मान बदलता है। इसका कोई मतलब नहीं है। atStartOfDay करता है कि javadoc जो कहता है वह करता है: यह एक LocalDate को एक LocalDateTime में, एक ही तिथि में और दिन की शुरुआत में बदल देता है।
जेबी निज़ेट

2
@cornz क्या आप सुनिश्चित हैं कि आपके परिणाम गलत हैं? यदि आप जर्मनी में हैं, तो अप्रैल 1893 में जर्मनी में 6 मिनट 32 सेकंड की गड़बड़ के साथ कुछ करना हो सकता है। कुछ विवरणों के लिए timeanddate.com/time/zone/germany/berlin?syear=1850 देखें। ।
दाऊद ibn करीम

104

यहाँ एक उपयोगिता वर्ग है जिसका उपयोग मैं नई java.timeकक्षाओं को java.util.Dateवस्तुओं में बदलने और इसके विपरीत करने के लिए करता हूँ:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

@Oliv टिप्पणी के आधार पर संपादित।


ZoneId.systemDefault()समस्याग्रस्त का उपयोग नहीं कर रहा है क्योंकि टाइमज़ोन वर्ष की लाश पर बदलते हैं। इसलिए यदि 01-जनवरी को मैं टाइमज़ोन -05: 00 (केंद्रीय) में हूं, लेकिन फिर 01-जुलाई को मैं टाइमज़ोन -06: 00 (केंद्रीय डेलाइट) में हूं, जो दिन के उजाले की बचत के कारण गलत परिणाम नहीं देगा। समय?
जिल्डेन

94

आप इस java.sql.Date.valueOf()विधि का उपयोग कर सकते हैं :

Date date = java.sql.Date.valueOf(localDate);

यहाँ समय और समय क्षेत्र की जानकारी जोड़ने की आवश्यकता नहीं है क्योंकि वे अंतर्निहित रूप से लिए गए हैं।
देखें LocalDate to java.util.Date और इसके विपरीत सरलतम रूपांतरण?


यह मेरे लिए एकदम सही था, क्योंकि मुझे लोकलडेट को SQL में पास करना था। हालाँकि, यदि आपका दिनांक फ़ॉर्मेटर दिनांक फ़ॉर्मेट करने से पहले टाइम ज़ोन शिफ्ट के बारे में कुछ करने जा रहा है, तो आपको स्थानीय समय क्षेत्र के आधार पर एक दिन की शुरुआत मिल सकती है, इस स्थिति में आप इसके बजाय उपरोक्त विकल्पों में से एक चाहते हैं।
टॉम डिबल

7
java.sql.Dateडेटाबेस लेयर, JDBC, JPA के लिए है। वेब लेयर (या कोई भी क्लाइंट एप्लिकेशन) बिल्कुल किसी भी निर्भरता से मुक्त होना चाहिए java.sql.*
टिनी

2
@ टाइनी java.sql.Date rt.jar में रहती है। कोई बाहरी निर्भरता नहीं हैं। आप बस भाषा सुविधाओं का उपयोग करें।
जॉर्ज

2
java.sql.Dateबस java.util.Dateअपने समय के साथ सेट है, 00:00:00लेकिन डिजाइन परिप्रेक्ष्य में बिंदु यह है कि java.sql.*सामने की परत के लिए इसका मतलब नहीं है जो क्लाइंट सर्वलेट्स / जेएसपी के साथ बातचीत करते हैं। java.util.Dateजावा पक्ष में और java.sql.Timestampया जो भी java.sql.*JDBC पक्ष से लागू हो
छोटे

5
यह java.time के अनुसार एक "भयानक हैक" है। * लेखक: stackoverflow.com/questions/33066904/… । जावा में 9 java.sql.*कक्षाएं एक अलग निर्भरता होगी।
ढेरिक

16

java.time में टेम्पोरल इंटरफ़ेस है जिसका उपयोग आप अधिकांश समय वर्गों से त्वरित ऑब्जेक्ट बनाने के लिए कर सकते हैं। तत्काल एपोच में समय पर मिलीसेकंड का प्रतिनिधित्व करता है - अन्य सभी तिथियों और समय के लिए आधार संदर्भ।

हमें रूपांतरण करने के लिए समय और क्षेत्र के साथ दिनांक को एक ZonedDateTime में बदलना होगा:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

12

एक java.util बनाने के लिए । java.time.ate से चुनें । आपको क्या करना है

  • LocalDate में एक समय जोड़ें
  • एक समय क्षेत्र के भीतर दिनांक और समय की व्याख्या करें
  • युग के बाद से सेकंड / मिलीसेकंड की संख्या प्राप्त करें
  • java.util.Date बनाएं

कोड निम्नानुसार लग सकता है:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

1
टाइपो इन ज़ोन आईडी (ज़ोनआईएफ)
अस्वेलियास

localDate.atStartOfDay () एक ZonedDateTime बनाता है, लेकिन ZonedDateTime के लिए कोई भी EEpochSecond () विधि नहीं है।
केविन सैडलर 10

@ केविनसडलर: विधि toEpochSecondसे विरासत में मिली है java.time.chrono.ChronoZonedDateTimeDocs.oracle.com/javase/8/docs/api/java/time/chrono/…
nosid

@nosid आपके सुधार के लिए धन्यवाद। जब मैं ग्रहण में कोड पूरा करने का उपयोग करता हूं (और यह) विकल्प के रूप में मौजूद नहीं है। लेकिन अगर मैं इसे पूरा टाइप करता हूं तो यह स्वीकार किया जा सकता है। मैंने गलत तरीके से निष्कर्ष निकाला था कि इस तथ्य के कारण यह एक विधि नहीं थी और मैंने इसे ज़ोनडॉक के लिए ज़ोनडॉक पर नहीं देखा, क्योंकि यह एक विरासत वाली विधि के रूप में सूचीबद्ध है, जैसा कि आप कहते हैं। क्षमा करें, कृपया अपीलीय स्वीकार करें :)
केविन सैडलर

11

यह मेरे लिए काम करता है:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--


6
यह काफी अक्षम है
एंड्रेसक्यू

1
झटपट में परिवर्तित होने की क्रिया हो सकती है, लेकिन एक स्ट्रिंग का निर्माण और पार्स करना न्यूयॉर्क से टोक्यो सिटी होते हुए टोक्यो की ओर जाना है ...
एहचैट

1
हां, इतना कुशल नहीं है, लेकिन अधिकांश समाधान बहुत ही क्रियात्मक हैं। यह सिर्फ क्रिया है और इसे पढ़ना और समझना आसान है।
ceklock

2
@ehecatl खबरदार ... भविष्य में NY -> टोक्यो -> मेक्सिको सिटी घंटे (ओं) के भीतर किया जा सकता है
स्टीफन

3

कोटलिन समाधान:

1) इस एक्सटेंशन फ़ंक्शन को कहीं पेस्ट करें।

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) इसका इस्तेमाल करें, और इसे फिर कभी गूगल न करें।

val myDate = myLocalDate.toDate()

11
"कोटलिन पर स्विच" कैसे सरल है? यह एक जावा प्रश्न है।
एहेकल्ट

1
जावा लोकलडेट को तारीख में बदलना किसी भी जेवीएम डेवलपर के लिए एक आम, कष्टप्रद समस्या है। यह कोटलिन डेवलपर्स के लिए एक समाधान है।
गयोडर



-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

आपका उत्तर 4 साल बाद स्वीकार किए जाने से अलग कैसे है? प्रतिष्ठा बढ़ाने के लिए कॉपी-पेस्ट?
स्टिंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.