Convert LocalDate को LocalDateTime या java.sql.Timestamp में बदलें


126

मैं JodaTime 1.6.2 का उपयोग कर रहा हूं।

मेरे पास एक है LocalDateकि मुझे या तो एक (जोडा) में बदलने की जरूरत है LocalDateTime, या एक java.sqlTimestampऑर्मिंग के लिए।

इसका कारण यह है कि मुझे पता है कि कैसे एक LocalDateTimeऔर एक के बीच में परिवर्तित करने के लिए java.sql.Timestamp:

LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));

तो, अगर मैं सिर्फ बीच में बदल सकते हैं LocalDateऔर LocalDateTime, तो मैं करने के लिए निरंतर रूपांतरण कर सकते हैं java.sql.Timestamp। सही दिशा में किसी भी गड़बड़ी के लिए धन्यवाद!


FYI करें, जोडा-टाइम परियोजना अब रखरखाव मोड में है , जिसमें टीम java.time कक्षाओं में प्रवास की सलाह दे रही है । ओरेकल द्वारा ट्यूटोरियल देखें । इसके अलावा, java.sql.Timestampवर्ग अब विरासत है, java.time कक्षाओं द्वारा विशेष रूप से द्वारा supplanted है Instant
तुलसी बॉर्क

जवाबों:


269

JodaTime

JodaTime's में कनवर्ट करने के org.joda.time.LocalDateलिए java.sql.Timestamp, बस करें

Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());

JodaTime's में कनवर्ट करने के org.joda.time.LocalDateTimeलिए java.sql.Timestamp, बस करें

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());

JavaTime

Java8 के कन्वर्ट करने के java.time.LocalDateलिए java.sql.Timestamp, बस करें

Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());

Java8 के कन्वर्ट करने के java.time.LocalDateTimeलिए java.sql.Timestamp, बस करें

Timestamp timestamp = Timestamp.valueOf(localDateTime);

से सावधान रहें जब परिवर्तित LocalDateTimeकरने के लिए DateTimeके रूप में नहीं सभी LocalDateTimeरों मान्य हैं DateTimeरों। स्रोत: joda-time.sourceforge.net/faq.html#illegalinstant और बस इसी में चल रहा है।
क्रिस्टोफ डे ट्रॉयर

मान के रूप में तर्क पर संकलन त्रुटि मिली () एक स्ट्रिंग को स्वीकार करता है।
देशभक्ति

@ पैट्रियोटिक: यह तभी होगा जब आप वास्तव में जावा एसई 1.8 या नए का उपयोग नहीं कर रहे हों। जैसा कि उत्तर में इंगित किया गया है और Javadoc को दिए गए लिंक में (उपरोक्त उत्तर में नीले रंग के ग्रंथ वास्तव में लिंक हैं, आप उन्हें क्लिक कर सकते हैं कि वे Javadoc में ड्रिल करें), Timestamp#valueOf()जावा एसई 1.8 भी एक के बाद से विधि स्वीकार करता है LocalDateTime
बालूसी

60

जावा 8 टाइम एपीआई का उपयोग करने का सबसे अच्छा तरीका:

  LocalDateTime ldt = timeStamp.toLocalDateTime();
  Timestamp ts = Timestamp.valueOf(ldt);

अपने मॉडल ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/use-java-8-datetime-classes-jpa ) के साथ JPA के उपयोग के लिए :

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
        return Timestamp.valueOf(ldt);
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp ts) {
        return ts.toLocalDateTime();
    }
}

तो अब यह सापेक्ष समयजोन स्वतंत्र समय है। इसके अतिरिक्त यह आसान है:

  LocalDate ld = ldt.toLocalDate();
  LocalTime lt = ldt.toLocalTime();

प्रारूपण:

 DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 String str = ldt.format(DATE_TME_FORMATTER);
 ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);

अद्यतन: 9.4.1208, HSQLDB 2.4.0 आदि पोस्ट जावा 8 टाइम एपीआई किसी भी बातचीत के बिना समझते हैं!


17

tl; डॉ

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

  • बसjava.time.Instant कक्षा का उपयोग करें
  • की कोई ज़रूरत नहीं:
    • LocalDateTime
    • java.sql.Timestamp
    • स्ट्रिंग्स

UTC में वर्तमान क्षण कैप्चर करें।

Instant.now()  

डेटाबेस में उस पल को स्टोर करने के लिए:

myPreparedStatement.setObject(  , Instant.now() )  // Writes an `Instant` to database.

डेटाबेस से उस पल को पुनः प्राप्त करने के लिए:

myResultSet.getObject(  , Instant.class )  // Instantiates a `Instant`

किसी विशेष समय क्षेत्र की दीवार-घड़ी के समय को समायोजित करने के लिए।

instant.atZone( z )  // Instantiates a `ZonedDateTime`

LocalDateTime गलत वर्ग है

अन्य उत्तर सही हैं, लेकिन वे यह इंगित करने में विफल रहते हैं कि LocalDateTimeआपके उद्देश्य के लिए गलत वर्ग है।

Java.time और Joda-Time दोनों में , LocalDateTimeजानबूझकर समय क्षेत्र या ऑफसेट- UTC की किसी भी अवधारणा का अभाव है। जैसे, यह एक पल का प्रतिनिधित्व नहीं करता है, और समयरेखा पर एक बिंदु नहीं है। ए लगभग 26-27 घंटे की सीमा के साथ संभावित क्षणों के LocalDateTimeबारे में एक मोटे विचार का प्रतिनिधित्व करता है ।

एक का उपयोग करें LocalDateTimeके लिए या तो क्षेत्र / ऑफसेट अज्ञात है (नहीं एक अच्छा स्थिति), या जब क्षेत्र ऑफसेट अनिश्चित है जब। उदाहरण के लिए, "क्रिसमस 25 दिसंबर, 2018 के पहले क्षण से शुरू होता है" का प्रतिनिधित्व एक के रूप में किया जाएगा LocalDateTime

ZonedDateTimeकिसी विशेष समय क्षेत्र में एक पल का प्रतिनिधित्व करने के लिए एक का उपयोग करें । उदाहरण के लिए, क्रिसमस किसी विशेष क्षेत्र में शुरू होता है जैसे कि किसी वस्तु के साथ Pacific/Aucklandया America/Montrealउसका प्रतिनिधित्व किया जाएगा ZonedDateTime

हमेशा यूटीसी में एक पल के लिए, उपयोग करें Instant

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

एक समय क्षेत्र लागू करें। एक ही पल, समय पर एक ही बिंदु, लेकिन एक अलग दीवार घड़ी समय के साथ देखा।

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, different wall-clock time.

इसलिए, अगर मैं केवल लोकलडेट और लोकलडेट टाइम के बीच परिवर्तित कर सकता हूं,

नहीं, गलत रणनीति। यदि आपके पास कोई दिनांक-केवल मान है, और आप दिनांक-समय मान चाहते हैं, तो आपको एक दिन का समय निर्दिष्ट करना होगा। उस समय का दिन किसी विशेष क्षेत्र के लिए उस तिथि पर मान्य नहीं हो सकता है - जिस स्थिति ZonedDateTimeमें जरूरत पड़ने पर दिन का समय स्वचालित रूप से समायोजित हो जाता है।

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ;  // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

यदि आप दिन का पहला क्षण अपने दिन के रूप में चाहते हैं, तो java.time को उस क्षण को निर्धारित करने दें । मान लीजिए दिन 00:00:00 पर शुरू होता है। डेलाइट सेविंग टाइम (DST) जैसे विसंगतियों का मतलब है कि दिन की शुरुआत किसी अन्य समय जैसे 01:00:00 बजे हो सकती है।

ZonedDateTime zdt = ld.atStartOfDay( z ) ;

java.sql.Timestamp गलत वर्ग है

java.sql.Timestampपरेशानी पुराने समय की कक्षाओं का एक हिस्सा है जो अब विरासत है, पूरी तरह से java.time कक्षाओं द्वारा समर्थित है । उस वर्ग का उपयोग यूटीसी में एक क्षण का प्रतिनिधित्व करने के लिए नैनोसेकंड के एक संकल्प के साथ किया गया था । इस उद्देश्य के साथ अब सेवा की जाती है java.time.Instant

JDBC 4.2 के साथ getObject/setObject

के रूप में JDBC 4.2 और बाद में, अपने JDBC ड्राइवर सीधे विनिमय कर सकते हैं java.time फोन करके डेटाबेस के साथ वस्तुओं:

उदाहरण के लिए:

myPreparedStatement.setObject(  , instant ) ;

… तथा …

Instant instant = myResultSet.getObject(  , Instant.class ) ;

कन्वर्ट विरासत leg आधुनिक

यदि आपको पुराने कोड के साथ इंटरफ़ेस करना चाहिए जो अभी तक java.time में अपडेट नहीं किया गया है , तो पुरानी कक्षाओं में जोड़े गए नए तरीकों का उपयोग करके आगे और पीछे कन्वर्ट करें।

Instant instant = myJavaSqlTimestamp.toInstant() ;  // Going from legacy class to modern class.

…तथा…

java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ;  // Going from modern class to legacy class.

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

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

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

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

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

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

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


5

आपके समयक्षेत्र के आधार पर, आप कुछ मिनट खो सकते हैं (1650-01-01 00:00:00 1649-12-31 23:52:58)

उससे बचने के लिए निम्न कोड का उपयोग करें

new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);

3

चूंकि Joda फीका हो रही है, किसी को परिवर्तित करने के लिए चाहते हो सकता है LocaltDateके लिए LocalDateTimeजावा 8. में जावा 8 में LocalDateTimeयह एक बनाने के लिए एक तरह से दे देंगे LocalDateTimeका उपयोग कर एक उदाहरण LocalDateऔर LocalTime। चेक यहाँ।

लोकल स्टेटिकट लोकलटाइम ऑफ़ (लोकलडेट डेट, लोकल टाइम समय)

नमूना होगा,

    // just to create a sample LocalDate
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate ld = LocalDate.parse("20180306", dtf);

    // convert ld into a LocalDateTime
    // We need to specify the LocalTime component here as well, it can be any accepted value
    LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

केवल संदर्भ के लिए, नीचे दिए गए युगों को प्राप्त करने के लिए, का उपयोग किया जा सकता है,

    ZoneId zoneId = ZoneId.systemDefault();
    long epoch = ldt.atZone(zoneId).toEpochSecond(); 

    // If you only care about UTC
    long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);

LocalDateTimeयहाँ बिल्कुल भी उपयोग करने की आवश्यकता नहीं है। उस वर्ग में समय क्षेत्र या ऑफसेट-यूटीसी की किसी भी अवधारणा का जानबूझकर अभाव है। तो यह यहाँ कोई उपयोगी उद्देश्य नहीं है। इसके बजाय: LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()मान लें कि दिन की शुरुआत 00:00 से होती है, हमेशा ऐसा नहीं होता।
तुलसी बोर्के

क्या आपका मतलब यह नहीं है कि दिन की शुरुआत 00.00 से होती है
प्राइम

1
डेलाइट सेविंग टाइम (DST) जैसी विसंगतियों का अर्थ है कि कुछ स्थानों पर कुछ तिथियों पर दिन की शुरुआत दूसरे समय में हो सकती है, जैसे कि 01:00:00। इसलिए, मानने के बजाय, java.timejava.time.LocalDate.atStartOfDay को ए पाने के लिए कॉल करके पहले पल का निर्धारण करें ZonedDateTimeमेरे उत्तर में उदाहरण देखें । जैसा कि मैंने टिप्पणी की, इस सब में LocalDateTimeवर्ग बेकार और प्रति-उत्पादक है।
बासिल बोर्के

तो हमारे साथ LocalDateTimeएक का उपयोग करना चाहिए ZoneId?
प्राइम

मुझे लगता है कि आपने मेरे सभी बिंदुओं को याद किया है। इस पेज पर मेरे जवाब को फिर से पढ़ें। कई और उदाहरणों और चर्चाओं से अधिक जानने के लिए स्टैक ओवरफ्लो खोजें। लेकिन मैं पिछली बार यहां के लिए कहूँगा: LocalDateTimeहै नहीं यहाँ हाथ में समस्या के लिए उपयुक्त। एक LocalDateTimeहै नहीं एक पल का प्रतिनिधित्व करते हैं। LocalDateTimeका किसी विशेष इलाके या समय क्षेत्र से कोई लेना- देना नहीं है, हालांकि पहली नज़र में नाम अन्यथा हो सकता है - इस वर्ग के इरादे और विवरण के बारे में अधिक जानें। LocalDateTimeवर्ग एक उद्देश्य पूरा करता है, लेकिन नहीं उद्देश्य इस प्रश्न में देखा।
तुलसी बॉर्क


0

जावा 8 +

import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)

उपयोगी है, लेकिन वास्तव में इस सवाल का जवाब नहीं लगता।
ओले वीवी

कोड के लिए धन्यवाद, लेकिन इसका सवाल से कोई लेना-देना नहीं है।
Refaelio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.