जावा दिनांक समय की जानकारी काट दी


121

मेरे पास एक जावा डेट ऑब्जेक्ट है जिसमें तारीख और समय की जानकारी है। मैं एक ऐसी विधि लिखना चाहता हूं जो समय की जानकारी को काटती है, घंटों-मिनट-सेकंड को काटती है, इसलिए मेरे पास केवल तारीख बची है।

उदाहरण इनपुट:

2008-01-01 13:15:00

अपेक्षित उत्पादन:

2008-01-01 00:00:00

क्या आपके पास कोई टिप है? मैंने ऐसा कुछ करने की कोशिश की:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

लेकिन मैं समयक्षेत्र के साथ समस्याओं में भाग गया।

जवाबों:


178

किसी वस्तु का उपयोग करने के लिए दिनांक / समय हेरफेर करने का अनुशंसित तरीका है Calendar:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();

2
@ क्लेटस, क्या दिनांक ऑब्जेक्ट से समय निकालना संभव है। मैं 2008-01-01 की तरह शुद्ध समय चाहता हूं, कोई समय भाग नहीं।
प्रेम

2
मैं यह नहीं कहूंगा कि java.util.Calendar की सिफारिश की गई है। Sun / Oracle ने जावा में उस वर्ग को नए java.time पैकेज के साथ दबा दिया। या तो जोडा-टाइम का इस्तेमाल करें।
तुलसी बॉर्क

3
कैलेंडर अब अनुशंसित नहीं है यदि आप जावा 8 का उपयोग कर रहे हैं तो stackoverflow.com/a/28868089/40064 देखें
विम डेब्लाउवे

2
FYI करें, पुराने समय की परेशान करने वाली पुरानी कक्षाएं जैसे कि java.util.Calendarअब विरासत , java.time कक्षाओं द्वारा ली गई । ओरेकल द्वारा ट्यूटोरियल देखें ।
तुलसी बोर्के

148

क्या आपने Apache Commons Lang में DateUtils ट्रंकट विधि को देखा है ?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

समय तत्व को हटा देगा।


9
अपडेट किया गया लिंक फिर से (अपाचे पर आएं! अपने डॉक्स को चारों ओर से छोड़ दें!)
Ogre Psalm33

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

जैसा कि @ क्लौड ने बताया, इस तथ्य को कि मैं यहां कैलेंडर उदाहरण नहीं देखता हूं (इस पर कोई नियंत्रण नहीं है) मुझे थोड़ा परेशान करता है :)
Jaroslav Záruba

यह विधि आश्चर्यजनक रूप से लंबी है और इसमें कम से कम दो बगफिक्स थे।
पीनो

42

क्या आपने जोडा को देखा है ? यह तारीखों और समय के साथ काम करने का एक बहुत आसान और अधिक सहज तरीका है। उदाहरण के लिए, आप स्थानीयतायत और लोकलडेट वस्तुओं के बीच तुच्छ रूप से परिवर्तित कर सकते हैं।

उदाहरण के लिए (एपीआई का वर्णन करने के लिए)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

इसके अतिरिक्त यह डेट / टाइम फॉर्मेटर्स के साथ कुछ थ्रेड-सेफ्टी मुद्दों को हल करता है और जावा में किसी भी डेट / टाइम इश्यू के साथ काम करने के लिए जोरदार सिफारिश की जाती है।


12
मेरा मानना ​​है कि यह करता है। टूटी हुई java.util कक्षाओं के साथ लड़ाई के बजाय एक बेहतर पुस्तकालय का उपयोग करने की सिफारिश की गई है (जैसा कि प्रश्न से स्पष्ट है)
ब्रायन एग्न्यू

10
बेशक यह संबंधित है, जोडा जावा में तारीख, समय और कैलेंडर हेरफेर के लिए पुस्तकालय है। इसकी सिफारिश नहीं करना कर्तव्य का अपमान होगा।
जोएल

1
थ्रेड सुरक्षा समस्या बहुत दिलचस्प है, मैंने इस पोस्ट को एक Oracle / हाइबरनेट त्रुटि "IllegalArgumentException, sun.util.calendar.ZoneInfo.getOffset (ZoneInfo), oracle .jdbc.driver.DateCommonBinder.zoneOffset (OraclePreparedStment) पर शोध करते हुए पाया। यह ओरेकल की अन्य समस्याओं के बारे में बात करता है जो केवल डब्ल्यू भारी लोड फ़ोरम में दिखाई देते हैं ।oracle.com/forums/thread.jspa?threadID=325576 सामान्य कोड में अमान्य मिलीसेकंड के साथ ऑब्जेक्ट बनाना वास्तव में कठिन है। मेरे लिए, मुझे लगता है कि मैं अपने धागे में जोडा का उपयोग करके डाउनकास्ट करूंगा, बजाय ओरेकल को संभवतः-संदिग्ध गैर-जोडा सामान का उपयोग करने दें।
मार्क बेनेट

4
मेरी इच्छा है कि मैं उन सभी को नीचा दिखाऊं जिन्होंने इसे वोट दिया था। ये सभी लोग कौन हैं जो +1 का उत्तर देते हैं जो प्रश्न का उत्तर देने का प्रयास भी नहीं करता है? Joda का उपयोग करने का जवाब स्वागत से अधिक होगा, लेकिन यह नहीं है ...
रयान

1
@ रेयान यह उत्तर कैसे प्रासंगिक नहीं है? प्रश्न बिना समय के तारीख के लिए पूछा गया। यह उत्तर एक ऐसे वर्ग को प्रस्तुत करता है जिसका एकमात्र उद्देश्य बिना समय के तारीख का प्रतिनिधित्व करता है।
तुलसी बॉर्क

35

अभी जावा और बाद में जावा में निर्मित java.time कक्षाओं के प्रकाश में एक त्वरित अद्यतन ।

LocalDateTimeएक truncatedToविधि है जो प्रभावी रूप से आपके बारे में जो बात कर रही है, उसे यहाँ संबोधित करती है:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

यह वर्तमान समय को केवल मिनटों तक घटाएगा:

2015-03-05T11:47

आप ट्रंकेशन को निष्पादित करने के लिए डीएईएस से छोटे ChronoUnit(या ए TemporalUnit) का उपयोग कर सकते हैं (क्योंकि ट्रंकेशन को केवल लोकल डेटाइम के समय भाग पर लागू किया जाता है, तिथि भाग के लिए नहीं)।


3
आप केवल DAYS तक ChronoUnits का उपयोग कर सकते हैं - उच्च इकाइयां एक अपवाद फेंक देगी।
9

26
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();

22

Joda से आप आसानी से अपेक्षित तिथि प्राप्त कर सकते हैं।

संस्करण २. के रूप में (हो सकता है कि कुछ पिछले संस्करण २.२ से अधिक हो), एक टिप्पणीकार नोट के रूप toDateMidnightमें, पक्ष में या उपयुक्त रूप से नामांकित किया गया है withTimeAtStartOfDay(), सुविधाजनक बना रहा है

DateTime.now().withTimeAtStartOfDay()

मुमकिन।

एक तरह से अच्छे एपीआई के लाभ को जोड़ा गया।

पुराने संस्करणों के साथ, आप कर सकते हैं

new DateTime(new Date()).toDateMidnight().toDate()

6
मध्य-रात्रि-संबंधित विधियाँ और कक्षाएं जोडा-टाइम में अब पदावनत हो गई हैं। डेवलपर्स उन्हें उपयोग करने के खिलाफ सलाह देते हैं। इसके बजाय विधि का उपयोग करें withTimeAtStartOfDay
बेसिल बोर्क

इशारा करने के लिए धन्यवाद। इस पर विचार करने के लिए उत्तर को अपडेट करें।
hrr

आप toLocalDateएक ऐसी वस्तु प्राप्त करने के लिए भी उपयोग कर सकते हैं जिसमें समय घटक भी नहीं है।
चार्ल्स वुड

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

8

मैंने नए java8 एपीआई के साथ ट्रंकेशन किया। मैंने एक अजीब चीज का सामना किया, लेकिन सामान्य तौर पर यह छोटा है ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);

कीवर्ड: java.time, जावा 8, LocalDateTime.truncatedTo ()
अलेक्जेंडर टेलर

1
यह उत्तर केवल यूटीसी समय क्षेत्र के संदर्भ के लिए तारीखों का उत्पादन करता है।
बेसिल बॉर्क

6

अपाचे से डेटुलेट्स का उपयोग करें, इस तरह से ट्रंकट के साथ:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);

यह स्थानीय TimeZone में छोटा हो जाएगा, UTC में नहीं कि दिनांक (getTime) का प्रतिनिधित्व करता है।
एपॉक्स

6

टाइमस्टैम्प के लिए:

timestamp -= timestamp % (24 * 60 * 60 * 1000)

3
इस कोड में एक छोटी सी त्रुटि है - बाएं ब्रैकेट को सही तरीके से नहीं रखा गया है, यह टाइमस्टैम्प होना चाहिए - = टाइमस्टैम्प% (24 * 60 * 60 * 1000)। इससे समय का हिस्सा कट जाएगा। और यकीन है कि यह रास्ता केदार वस्तु बनाने और अपने तरीकों से खेलने या यहां तक ​​कि किसी भी तीसरे पक्ष के पुस्तकालयों का उपयोग करने से ज्यादा पर्याप्त है
स्टेन

2
नहीं, यह सही समाधान नहीं है। यह मंजिल के लिए दिनांक मान को गोल करने के समान है, अर्थात - आपको 29 मार्च के टाइमस्टैम्प के लिए 28 मार्च (आपके स्थान पर) मिल सकता है। तो कैलेंडर-आधारित समाधान (Apache DateUtils कैलेंडर का उपयोग करता है, भी) एकमात्र तरीका है
आकर्षित

डेलाइट सेविंग टाइम के कारण समय बदलने पर यह भी काम नहीं करेगा।
अलेक्जेंड्रू सेवरिन

5

Java.util.Date JavaDocs से:

कक्षा की तारीख एक विशिष्ट तात्कालिक समय का प्रतिनिधित्व करती है, जिसमें मिलीसेकंड सटीक होता है

और java.sql.Date JavaDocs से:

SQL DATE की परिभाषा के अनुसार, java.sql.Date के उदाहरण से लिपटे मिलीसेकंड मान को घंटे, मिनट, सेकंड और मिलीसेकंड पर सेट करके 'सामान्यीकृत' किया जाना चाहिए, जो उस विशेष समय क्षेत्र में शून्य है, जिसके साथ उदाहरण जुड़ा हुआ है ।

तो, सबसे अच्छा तरीका java.sql का उपयोग करना है। यदि आपको समय भाग की आवश्यकता नहीं है तो

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

और आउटपुट है:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26

4

tl; डॉ

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString()                                     // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.

2008-01-01T00: 00 + 01: 00 [यूरोप / पेरिस]

अपने वांछित प्रारूप में एक स्ट्रिंग उत्पन्न करने के लिए, पास करें DateTimeFormatter

LocalDateTime.parse(                            // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
    "2008-01-01 13:15:00".replace( " " , "T" )  // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate()                                  // Extract a date-only value.
.atStartOfDay(                                  // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
    ZoneId.of( "Europe/Paris" )                 // Determining a specific start-of-day requires a time zone.
)                                               // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format(                                        // Generate a String representing the object’s value.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME       // Built-in predefined formatter close to what you want. 
)
.replace( "T" , " " )                           // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.

2008-01-01 00:00:00

विवरण

अन्य उत्तर सही हैं, लेकिन पुराने समय-समय की कक्षाओं का उपयोग करते हैं जो अब java.time फ्रेमवर्क द्वारा उल्लिखित हैं।

java.time

Java.time फ्रेमवर्क जावा 8 और बाद में बनाया गया है। जावा। टाइम की अधिकांश कार्यक्षमता जावा 6 और 7 ( थ्रीटीन-बैकपोर्ट ) पर वापस पोर्ट की गई है और आगे एंड्रॉइड ( थ्रीटेनबप ) के लिए अनुकूलित है ।

आईएसओ 8601 प्रारूप के विहित संस्करण के अनुपालन के लिए पहले इनपुट स्ट्रिंग में परिवर्तन करें। मानक ISO 8601 प्रारूप का उपयोग java.time कक्षाओं में डिफ़ॉल्ट रूप से पार्सिंग / जनरेटिंग स्ट्रिंग्स के लिए किया जाता है जो दिनांक-समय मानों का प्रतिनिधित्व करते हैं। हमें उस SPACE को बीच में बदलने की आवश्यकता है a T

String input = "2008-01-01 13:15:00".replace( " " , "T" );  // → 2008-01-01T13:15:00

अब हम इसे एक के रूप में पार्स कर सकते हैं LocalDateTime, जहां "स्थानीय" का अर्थ है कोई विशिष्ट स्थानीयता नहीं। इनपुट में किसी भी ऑफसेट-यूटीसी या समय क्षेत्र की जानकारी का अभाव है ।

LocalDateTime ldt = LocalDateTime.parse( input );

ldt.toString () ... 2008-01-01T13: 15: 00

यदि आप समय-समय पर या समय-क्षेत्र के बारे में परवाह नहीं करते हैं, तो a में कनवर्ट करें LocalDate

LocalDate ld = ldt.toLocalDate();

ld.toString () ... 2008-01-01

पहला पल

यदि इसके बजाय आप दिन के पहले क्षण के लिए दिन का समय निर्धारित करना चाहते हैं ZonedDateTime, तो एक वर्ग का उपयोग करें , फिर किसी विधि को LocalDateउसकी atStartOfDayविधि को कॉल करें । ध्यान रखें कि 00:00:00डेलाइट सेविंग टाइम या शायद अन्य विसंगतियों के कारण पहला क्षण नहीं हो सकता है ।

समय क्षेत्र महत्वपूर्ण है क्योंकि किसी भी क्षण के लिए तिथि क्षेत्र के अनुसार दुनिया भर में बदलती है। उदाहरण के लिए, पेरिस में आधी रात के बाद के कुछ क्षण पेरिसियों के लिए एक नया दिन है, लेकिन अभी भी कनाडाई लोगों के लिए मॉन्ट्रियल में "कल" ​​है।

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );

zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [अमेरिका / मॉन्ट्रियल]

यु.टी. सी

UTC टाइम ज़ोन के लेंस के माध्यम से उस क्षण को देखने के लिए , एक Instantऑब्जेक्ट निकालें । दोनों समयरेखा पर एक ही पल का प्रतिनिधित्व करेंगे ZonedDateTimeऔर Instantदो अलग - अलग दीवार-घड़ी के रूप में दिखाई देंगे ।

एक Instantमूलभूत भवन-खंड वर्ग है java.time में, हमेशा यूटीसी में परिभाषा के अनुसार। इस वर्ग का अक्सर उपयोग करें, जैसा कि आप आमतौर पर अपने व्यापार तर्क, डेटा भंडारण और यूटीसी में डेटा एक्सचेंज कर रहे होंगे।

Instant instant = zdtStartOfDay.toInstant();

Instant.toString ()… 2008-01-01T05: 00: 00Z

हम आधी रात के बजाय सुबह 5 बजे देखते हैं। मानक प्रारूप में, Zअंत Zulu"UTC" का अर्थ और कम होता है।


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

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, और अधिक



2

सवाल विरोधाभासी है। यह दिन के समय के बिना तारीख के लिए पूछता है फिर भी समय के साथ एक उदाहरण प्रदर्शित करता है 00:00:00

Joda समय

अद्यतन: Joda समय परियोजना में है रखरखाव मोड , टीम के लिए प्रवास की सलाह दे साथ java.time कक्षाएं। Java.time समाधान के लिए मेरे अन्य उत्तर देखें ।

यदि इसके बजाय आप दिन के पहले क्षण के लिए दिन का सेट चाहते हैं, DateTimeतो Joda-Time लाइब्रेरी पर किसी ऑब्जेक्ट का उपयोग करें और इस withTimeAtStartOfDayविधि को कॉल करें । ध्यान रखें कि 00:00:00डेलाइट सेविंग टाइम या शायद अन्य विसंगतियों के कारण पहला क्षण नहीं हो सकता है ।


यह निश्चित उत्तर है (यह मानते हुए कि कोई व्यक्ति जोडा समय का उपयोग कर सकता है और करना चाहता है)
क्लिंट ईस्टवुड

2

बस clear()निरर्थक खेत।

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();

Java 8 से एक बेहतर विकल्प truncatedToविधि का उपयोग करना है LocalDateTime, जैसे:

LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)

यह काम नहीं करता है, क्योंकि calendar.clear(Calendar.HOUR_OF_DAY);यह स्पष्ट घंटे नहीं है। @ क्लेटस से समाधान ठीक काम करता है।
अरको

क्षमा करें, आप सही हैं, मैंने इसे ठीक किया, घंटों तक आपको मान सेट करना चाहिए। सामान्य तौर पर यह लगभग उसी तरह होता है जैसे कैसे तिथि को काट दिया जाए ...
m190

1

यह वास्तव में मुझे परेशान करता है कि नया "बेहतर" कैलेंडर निर्माणकर्ता "भयानक" पुरानी तिथि एक की तरह मिलीसेकंड के लिए एक इंट नहीं लेता है। मैंने तब सच में क्रॉस किया और यह लिखा:

long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);

मैंने उस समय "सामान" शब्द का उपयोग नहीं किया था, लेकिन फिर मुझे इस बात की खुशी हुई:

startTime.set(Calendar.MILLISECOND, 0);

लेकिन मैं अभी भी इसके बारे में काफी पार हूं।


1

मैंने इस तरह का मुद्दा तय किया (पूर्वी आठ ज़ोन (बीजिंग समय) में):

private Date getTruncatedDate(Date d) {
    if (d == null) {
        return null;
    }
    long h = 60 * 60 * 1000L;
    long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
    return new Date(dateStamp);
}

सबसे पहले, आपको स्पष्ट होना चाहिए कि समय टिकट क्या है। टाइम स्टैम्प GMT के जनवरी 01 00:00:00 से (यूटीसी के समान), या थू जन 01 08:00:00 सीएसटी 1970 से अब तक कुल मिलीसेकंड है।

याद रखें: टाइम स्टैम्प टाइम ज़ोन से स्वतंत्र है।

तो आप अलग-अलग समय क्षेत्रों में निम्नलिखित कथन के साथ एक ही परिणाम प्राप्त करते हैं:

System.out.println(new Date().getTime());

तथा

System.out.println(new Date(0));

अलग-अलग समय क्षेत्रों में अलग-अलग समय की जानकारी प्रिंट करता है: यदि आप अपने पीसी समय क्षेत्र को यूटीसी के रूप में सेट करते हैं, तो आप प्राप्त करते हैं

Thu Jan 01 00:00:00 UTC 1970

लेकिन यदि आप समय क्षेत्र को (UTC +8: 00) बीजिंग, चोंगकिंग, हांगकांग, उरूमूक के रूप में निर्धारित करते हैं, तो आप निम्न कार्य करते हैं:

Thu Jan 01 08:00:00 CST 1970

जावा को समय टिकट मिलता है, फिर समय क्षेत्र के अनुसार तिथि और समय की जानकारी प्रदर्शित होती है।

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

जैसा कि पूर्वी आठ ज़ोन (बीजिंग समय) में, बीजिंग समय GMT से 8 घंटे पहले है, इसलिए जब आप मॉडुलो ऑपरेशन करते हैं, तो आपको अधिक 8 घंटे घटाना चाहिए। यह कहना है, आपको पहले जीएमटी समय मिलना चाहिए, फिर जावा आपके पीसी के समय क्षेत्र सेटिंग के आधार पर प्रदर्शन समय 8 घंटे जोड़ देगा।


समय क्षेत्र का मुद्दा अस्पष्ट है, और मुझे लंबे समय तक याद भी है। अब मैं इसे स्पष्ट करता हूं। आशा मदद करती है।


2018-01-04 नीचे दी गई विधि भी काम करती है।

private Date getTruncatedDate2(Date d) {
    Calendar cal = Calendar.getInstance(); // locale-specific
    cal.setTime(d);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);


return cal.getTime();

}


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

1

आप समयक्षेत्र के मुद्दे से बचने के लिए ऐसा कर सकते हैं:

public static Date truncDate(Date date) {
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTime();
}

हालांकि जावा Dateऑब्जेक्ट टाइमस्टैम्प मूल्य है, लेकिन ट्रंकट के दौरान, इसे स्थानीय टाइमज़ोन में बदल दिया जाएगा, इसलिए यूटीसी टाइमज़ोन से मूल्य की उम्मीद करने पर आपको आश्चर्यजनक मूल्य मिलेगा।


परेशानी Calendarऔर Dateकक्षाएं जावा में 8 साल बाद जावा 8 और बाद में java.time कक्षाएं लागू करने के साथ विरासत बन गईं । 2018 में उनके उपयोग का सुझाव देना खराब सलाह है।
तुलसी बोर्के

0

एक देर से प्रतिक्रिया हो सकती है लेकिन यहां किसी भी पुस्तकालयों का उपयोग किए बिना इसे एक पंक्ति में करने का एक तरीका है:

new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))

0

साथ Joda समय संस्करण 2.0 के बाद से आप उपयोग कर सकते हैं LocalDate.toDate()

केवल

// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();

[A] आपका उत्तर बेमानी है। पहले से ही ब्रायन एग्न्यू द्वारा पोस्ट किया गया है । [ख] आपका कोड गलत है, क्योंकि यह समय क्षेत्र की अनदेखी करता है, जो प्रश्न में उठाया गया मुद्दा है।
बेसिल बॉर्कल

निरर्थक हो सकता है, लेकिन मैंने सिर्फ एक सरल उदाहरण यहां दिया है क्योंकि मैंने माना है कि एक उत्तर टिप्पणियों में नहीं होना चाहिए। हां, java.util.Date TimeZone को नजरअंदाज करता है लेकिन मूल प्रश्न a Java Date objectइस प्रकार था कि मैंने इसका उपयोग किया java.util.Date। इसके अलावा यह नहीं समझाता है कि java.util.Date (जब (??) के साथ उसका टाइमजोन कैसे समस्याग्रस्त है, हालांकि वह इसके अलावा अन्य का उपयोग करने में मदद नहीं कर सकता है Date
लामसिक जूल

0

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

public static Date truncateDate(Date date) {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
    c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
    c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
    c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
    return c.getTime();
}

लेकिन मुझे यह पसंद है:

public static Date truncateDate(Date date) {
    return new java.sql.Date(date.getTime());
}

java.sql.Dateवर्ग एक तिथि-केवल मूल्य का प्रतिनिधित्व करने का दावा करता है, लेकिन वास्तव में एक समय दिन-का-UTC समय क्षेत्र के लिए समायोजित करता है। इसलिए वास्तव में प्रश्न का कोई हल नहीं है।
बेसिल बॉर्क

0

यदि आप जावा 8+ का उपयोग कर रहे हैं तो समय के बिना तारीख प्राप्त करने का एक सरल तरीका है: दिनांक के बजाय java.time.ocalDate प्रकार का उपयोग करें ।

LocalDate now = LocalDate.now();
 System.out.println(now.toString());

उत्पादन:

2019-05-30

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


1
का उपयोग करते हुए LocalDateसबसे प्रयोजनों के लिए एक अच्छा विचार है, लेकिन यह स्पष्ट नहीं है कि यह कैसे सवाल से इनपुट के साथ काम करेंगे, 2008-01-01 13:15:00
ओले वीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.