आज की आधी रात और कल की आधी रात का जावा डेट ऑब्जेक्ट कैसे बनाएं?


178

मेरे कोड में मुझे अपनी सभी चीजों को खोजने की आवश्यकता है जो आज हुईं। इसलिए मुझे आज की तारीखों के मुकाबले सुबह ००:०० बजे (मध्यरात्रि आज सुबह) से दोपहर १२:०० बजे (मध्यरात्रि मध्यरात्रि) तक तुलना करने की आवश्यकता है।

मुझे पता है ...

Date today = new Date(); 

... मुझे अभी मिलता है। तथा ...

Date beginning = new Date(0);

... मुझे 1 जनवरी 1970 को शून्य समय मिलता है। लेकिन आज शून्य समय और कल शून्य समय प्राप्त करने का एक आसान तरीका क्या है?

अपडेट करें; मैंने ऐसा किया, लेकिन निश्चित रूप से एक आसान तरीका है?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();

Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

3
मेरी राय में जोदा टाइम आसान है, मेरे जवाब के अंत में देखें। अगर आप java.util.Date/Calendar का उपयोग करना चाहते हैं तो आपको इस तरह से करना होगा, इसे करने का कोई आसान तरीका नहीं है।
तिमस्चेव

RE: टाइमसाचे ने Joda-Time का उपयोग करने के लिए टिप्पणी की, यह जान लें कि Joda-Time परियोजना अब रखरखाव मोड में है, और java.time कक्षाओं में प्रवासन की सलाह देती है।
बेसिल बोर्के

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

2
यह एक प्रश्न के इतने सारे त्रुटिपूर्ण उत्तर देखने के लिए शायद ही कभी हो। मैं तुलसी बोर्क द्वारा उत्तर देने की सलाह देता हूं , यह सही और ज्ञानवर्धक है।
ओले वीवी

जवाबों:


344

java.util.Calendar

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.LocalTime और java.time.LocalDate

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

Joda समय

यदि आप JDK <8 का उपयोग कर रहे हैं, तो मैं Joda Time की सलाह देता हूं , क्योंकि API वास्तव में अच्छा है:

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

चूंकि Joda समय के संस्करण 2.3 DateMidnightहै पदावनत है, इसलिए इस का उपयोग करें:

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

यदि आप JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र नहीं चाहते हैं तो एक समय क्षेत्र पास करें।

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

मदद के लिए धन्यवाद, मैंने अभी अपने मूल प्रश्न को अपडेट किया था कि मैं वर्तमान में यह कैसे कर रहा था। सलाह के लिये धन्यवाद।

3
JodaTime 2.3 के रूप में, toDateMidnightपदावनत किया जाता है। विवरण के लिए इस उत्तर को देखें: stackoverflow.com/a/19048833/363573
Stephan

JDK 8 के लिए एक समाधान जोड़ा गया
टाइमशेव

1
@timaschew आम तौर पर सही होने के दौरान, मैं सुझाव देता हूं कि java.time को ज़ोन किए गए दिनांक-समय मान ( ZonedDateTime) का उपयोग करते हुए जैसा कि आपने जोडा-टाइम सेक्शन में किया था। Local…अपने पूरे उद्देश्य / उपेक्षा सभी ऑफसेट और समय क्षेत्र विवरण है कि, कोई खो - प्रकार कोई समय क्षेत्र जानकारी नहीं है। खासकर जब प्रश्न तुलना के लिए इन मूल्यों का उपयोग करने के बारे में बात करता है (शायद डेटाबेस प्रश्न?), एक ज़ोनड डेट-टाइम मान अधिक उपयोगी होने की संभावना है।
तुलसी बॉर्क

1
@Alamgovinus Calendar.HOUR_OF_DAY सेट करना सुनिश्चित करें, न कि Calendar.HOUR।
ओसवाल्ड

43

पूर्णता के लिए, यदि आप Java 8 का उपयोग कर रहे हैं, तो आप UTC में मध्यरात्रि प्राप्त करने के लिए कक्षा की truncatedToविधि का भी उपयोग कर सकते हैं ।Instant

Instant.now().truncatedTo(ChronoUnit.DAYS);

जैसा कि जावदोक में लिखा गया है

उदाहरण के लिए, MINUTES इकाई के साथ ट्रंकटिंग निकटतम मिनट तक गोल हो जाएगी, सेकंड और नैनोसेकंड को शून्य पर सेट करेगी।

आशा करता हूँ की ये काम करेगा।


1
संकेत के लिए धन्यवाद। निर्दिष्ट समयक्षेत्र में मध्यरात्रि प्राप्त करना लंबा हो जाता है:Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
वडज़िम


33

आधी रात खोजने का सबसे आसान तरीका:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

अगले दिन:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

मैंने उस कोड को चलाया और मिला: मिडनाइट: थू नवंबर 01 19:00:00 सीडीटी 2012
डेव

3
यदि आपने System.out.print (दिनांक) जैसा कुछ किया है, तो सिस्टम ने दिनांक उदाहरण को सिस्टम टाइम ज़ोन (CDT) में बदल दिया। सीडीटी में शाम 7 बजे जीएमटी में आधी रात है। यदि आपको किसी चयनित समय क्षेत्र में आधी रात की आवश्यकता है, तो आपको इस समय क्षेत्र की ऑफसेट को जोड़ना होगा, जिसमें डीएसटी को ध्यान में रखा जाएगा।
आंद्रेई वोल्गिन

@ बाउंसर यह है। पृथ्वी पर कई अलग-अलग 'मध्यरात्रि' हैं चाहे आप किस विधि का उपयोग करते हों, लेकिन केवल एक जावा मध्यरात्रि है।
आंद्रेई वोल्जिन

2
@Andrei Volgin को नहीं पता था कि "जावा आधी रात" है। ;) जो मैं यह कहना चाहता था कि यह समाधान वास्तव में विषय निर्माता की मदद नहीं करता है। एक कैलेंडर समाधान बदसूरत दूसरी-गणना से बचता है और ठीक से उपयोग किए जाने पर टाइमज़ोन (और विशेष रूप से दिन की बचत के समय आदि) का ख्याल रखता है। मुझे वह आपके समाधान में नहीं दिखता है।
बाउंसर

हाय @AndreiVolgin, मुझे दिनांक दिनांक = नई दिनांक (समय + TimeZone.getDault ()। GetRawOffset () - समय% (24 * 60 * 60 * 1000)) के साथ मिला;
j

28

याद रखें, दिनांक (!) Dateका प्रतिनिधित्व करने के लिए उपयोग नहीं किया जाता है । तारीख का प्रतिनिधित्व करने के लिए आपको एक कैलेंडर की आवश्यकता होती है। यह:

Calendar c = new GregorianCalendar();

Calendarआपके वर्तमान समय क्षेत्र में वर्तमान दिनांक का प्रतिनिधित्व करने वाला एक उदाहरण बनाएगा । अब आपको हर क्षेत्र को दिन (घंटा, मिनट, दूसरा और मिलीसेकंड) के नीचे सेट करके अलग करना है 0। अब आपके पास आज आधी रात है।

अब अगले दिन आधी रात पाने के लिए, आपको एक दिन जोड़ना होगा:

c.add(Calendar.DAY_OF_MONTH, 1);

ध्यान दें कि 86400इस बीच होने वाले गर्मी के समय के कारण सेकंड या 24 घंटे जोड़ना गलत है।

अद्यतन: हालांकि इस समस्या से निपटने के लिए मेरा पसंदीदा तरीका कॉमन्स लैंग से डेट यूटिल्स क्लास का उपयोग करना है :

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

यह Calendarपर्दे के पीछे का उपयोग करता है ...


15
सहायता के लिए धन्यवाद। "दिनांक का उपयोग तिथियों का प्रतिनिधित्व करने के लिए नहीं किया जाता है" - हम बहुत ही शानदार शानदार हैं, है ना? ;)

@RobertHume निष्पक्ष होने के लिए, जावा की पहली रिलीज़ के बाद से तिथि लगभग हो गई है। उस युग की अधिकांश बातें पूरी तरह से सोची गई बातों से कम हैं। विशेष रूप से चूंकि जावा उन चीजों के प्रकार की कोशिश करने वाले पहले लोगों में से एक था, और यह कैसे करना है, इसके लिए सहमत-मानक से बहुत दूर था ।
निधि मोनिका का मुकदमा

14

ये तरीके आपकी मदद करेंगे-

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

तथा

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

9

JodaTime 2.3 के रूप में, toDateMidnight()पदावनत किया जाता है।

से 2.2 से 2.3 के लिए अद्यतन

    2.2 से पदावनति
    ----------------------
    - DateMidnight [# 41]
     यह वर्ग अवधारणा में त्रुटिपूर्ण है
     आधी रात का समय कभी-कभी कुछ समय-क्षेत्रों में नहीं होता है
     यह 00:00 से 01:00 तक दिन के समय की बचत का परिणाम है
     DateMidnight अनिवार्य रूप से एक DateTime है, जिसमें मध्यरात्रि को लॉक किया गया है
     ऐसी अवधारणा आम तौर पर उपयोग करने के लिए एक गरीब है, जिसे लोकलडेट दिया जाता है
     स्थानीय दिनांक के साथ DateMidnight बदलें
     या इसे DateTime के साथ बदलें, शायद withTimeAtStartOfDay () विधि का उपयोग कर

यहाँ toDateMidnight()विधि के बिना एक नमूना कोड है ।

कोड

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

आउटपुट ( आपके स्थानीय समय क्षेत्र के आधार पर भिन्न हो सकता है )

2013-09-28 00:00:00

2
बहुत बढ़िया जवाब। मैं DateTimeZoneउस DateTimeकंस्ट्रक्टर को एक उदाहरण देने के अलावा अनजाने में डिफ़ॉल्ट के आधार पर समय क्षेत्र को निर्दिष्ट करने के महत्व पर जोर देने के लिए DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
बनाऊंगा

9

अन्य उत्तर सही हैं, विशेष रूप से arganzheng द्वारा java.time उत्तर । जैसा कि कुछ उल्लेख किया गया है, आपको पुराने java.util.Date/.Calendar कक्षाओं से बचना चाहिए क्योंकि वे खराब रूप से डिज़ाइन किए गए हैं, भ्रमित करते हैं, और परेशान करते हैं। उन्हें java.time कक्षाओं द्वारा दबा दिया गया है।

मुझे आधी रात को संभालने और समय के अंतराल के आसपास रणनीति के बारे में नोट्स जोड़ने दें ।

आधा खुला

तिथि-समय के काम में, समय के अंतराल को अक्सर "हाफ-ओपन" दृष्टिकोण का उपयोग करके परिभाषित किया जाता है। इस दृष्टिकोण में शुरुआत समावेशी है जबकि अंत अनन्य है । यह समस्याओं को हल करता है और यदि लगातार उपयोग किया जाता है तो यह आपकी तारीख-समय को संभालने में बहुत आसान होता है।

हल की गई एक समस्या दिन के अंत को परिभाषित कर रही है। दिन का अंतिम क्षण 23:59:59.999( मिलीसेकंड ) है? शायद, java.util.Date क्लास में (जल्द से जल्द जावा से; तकलीफदेह - इस क्लास से बचें!) और बेहद सफल Joda-Time लाइब्रेरी में। लेकिन अन्य सॉफ्टवेयर में, जैसे डेटाबेस जैसे पोस्टग्रेज, अंतिम क्षण 23:59:59.999999( माइक्रोसेकंड ) होगा। लेकिन अन्य सॉफ्टवेयर जैसे कि java.time फ्रेमवर्क (जावा 8 में निर्मित और बाद में, जोडा-टाइम के उत्तराधिकारी) और कुछ डेटाबेस जैसे H2 डेटाबेस में , अंतिम क्षण 23:59.59.999999999( नैनोसेकंड ) हो सकता है । बालों को विभाजित करने के बजाय, केवल पहले क्षण के संदर्भ में सोचें, अंतिम क्षण नहीं।

हाफ-ओपन में, एक दिन एक दिन के पहले क्षण से चलता है और ऊपर जाता है लेकिन अगले दिन का पहला क्षण शामिल नहीं करता है। तो इस तरह से सोचने के बजाय:

... आज से प्रातः 00:00 बजे (मध्यरात्रि प्रातः काल) से दोपहर 12:00 बजे (मध्य रात्रि)।

… ऐसा सोचें…

आज के पहले क्षण से, लेकिन कल के पहले क्षण को शामिल करते हुए:
(> = 00:00:00.0आज और < 00:00:00.0कल)

डेटाबेस कार्य में, यह दृष्टिकोण SQL में ऑपरेटर का उपयोग नहीं करता है।BETWEEN

दिन की शुरुआत

इसके अलावा, दिन का पहला क्षण हमेशा समय का नहीं होता है 00:00:00.0डेलाइट सेविंग टाइम (डीएसटी) कुछ समय क्षेत्रों में, और संभवतः अन्य विसंगतियों का मतलब है कि दिन शुरू होने का एक अलग समय हो सकता है।

तो java.time कक्षाओं को एक कॉल के साथ एक दिन की शुरुआत निर्धारित करने का काम करते हैं LocalDate::atStartOfDay( ZoneId )। इसलिए हम के माध्यम से चक्कर है LocalDateऔर वापस करने के लिए ZonedDateTimeआप इस उदाहरण कोड में देख सकते हैं।

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

वैकल्पिक के पारित होने पर ध्यान दें ZoneId। यदि आपके JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र को छोड़ दिया गया है, तो यह अंतर्निहित है। स्पष्ट होना बेहतर है।

समय-क्षेत्र कार्य के लिए महत्वपूर्ण है। प्रश्न और कुछ अन्य उत्तर संभावित रूप से त्रुटिपूर्ण हैं क्योंकि सचेत रूप से समय क्षेत्र को नहीं संभालते हैं।

धर्मांतरित

यदि आपको java.util.Date या .Calendar का उपयोग करना है , तो उन पुरानी कक्षाओं में जोड़े गए नए रूपांतरण तरीकों की तलाश करें।

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

समय की सीमा

वैसे, अगर आप बहुत समय से काम कर रहे हैं, तो एक नज़र डालें:

  • Duration
  • Period
  • Interval
    Intervalवर्ग में पाया जाता है ThreeTen-अतिरिक्त , परियोजना java.time ढांचे के लिए एक विस्तार। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए साबित होने वाला आधार है।
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

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

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


6

java.time

यदि आप जावा 8 और उसके बाद का उपयोग कर रहे हैं, तो आप java.time पैकेज ( ट्यूटोरियल ) आज़मा सकते हैं :

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

2
अच्छा उत्तर। मैं वांछित / अपेक्षित समय क्षेत्र निर्दिष्ट करने का सुझाव दूंगा। JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र OS सेटिंग्स, कंप्यूटर को बदलते हुए, या JVM के किसी भी थ्रेड में किसी भी ऐप को रनटाइम के दौरान किसी भी समय डिफ़ॉल्ट बदल सकता है।
बेसिल बोर्क

4

यह एक विकल्प प्रतीत होता है:

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

इसमें एक दिन जोड़ने के लिए, या तो

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

या

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

मेरे पास एक कूबड़ है जिसे कुछ अजीब तरह से पसंद किया जाता है जैसे कि दिन के उजाले की बचत 24 घंटे जोड़ने के लिए पर्याप्त नहीं है (देखें https://stackoverflow.com/a/4336131/32453 और इसके अन्य उत्तर)।


मेरे पास एक दिन और समय का समय है जब मैं अपने sqlite डेटाबेस में एक लंबे समय के रूप में प्रतिनिधित्व करता हूं। मुझे अगले दिन की शुरुआत के लिए लंबा समय चाहिए। क्या मैं अभी भी मेरे द्वारा उपयोग किए जाने वाले SimpleDateFormat पद्धति के बजाय अपने लंबे समय के साथ दिनांक ऑब्जेक्ट का उपयोग कर सकता हूं?
एजेडब्ल्यू

1
जब तक यह सही मिलीसेकंड है आप इसे एक निर्माता के रूप में पारित कर सकते हैं: docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack

1

मैंने यहां हर किसी की तुलना में यह अलग किया। मैं जावा के लिए नया हूं, इसलिए शायद मेरा समाधान खराब है।

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

मुझे यकीन नहीं है कि यह अभी तक काम कर रहा है, लेकिन किसी भी तरह से, मैं इस समाधान पर किसी भी प्रतिक्रिया की सराहना करूंगा।

मैं ऊपर दिए गए बयान से भ्रमित हूं कि आप कल को कॉल करके गणना कर सकते हैं:

c.add(Calendar.DAY_OF_MONTH, 1);

यदि आप महीने के दिन में 1 जोड़ते हैं और यह 31 वां दिन है, तो क्या आपको महीने का 32 वां दिन नहीं मिलता है?

जावा में UTC पर आधारित समय / तिथि सभी क्यों नहीं हैं? मुझे लगता है कि Timezones को केवल i / o के साथ उपयोग करने की आवश्यकता होनी चाहिए, लेकिन आंतरिक रूप से हमेशा UTC में उपयोग किया जाना चाहिए। हालांकि, कक्षाएं टाइमज़ोन जानकारी को शामिल करती हैं जो न केवल बेकार है, बल्कि कोडिंग त्रुटियों से ग्रस्त है।


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

पदावनति को लेकर दुखी। यह घंटे, मिनट, दूसरे और मिलीसेकंड को साफ करने के बजाय वर्ष, महीना और तारीख निर्दिष्ट करने के लिए मुझे बहुत साफ लगता है। ये समाशोधन मिलिसेक पर तारीख वर्ग का सबसे अच्छा ग्रैन्युलैरिटी होने पर निर्भर करता है, जबकि मेरा समाधान नहीं करता है। मेरा समाधान भी छोटा और स्पष्ट है। जावा के लिए नया होना वास्तव में मेरी सराहना करता है कि जब तारीख और समय का उपयोग करने की बात आती है तो सी + + कितना साफ, आसान और कुशल होता है।
मिच

@ मिच मेरे अनुभव में, सबसे हाल की भाषा जिसे आप सीख रहे हैं, हमेशा सबसे जटिल माना जाता है।
आर्टऑफवर्फ

FYI करें: ये खूनी भयानक पुराने समय की कक्षाएं अब आधुनिक java.time कक्षाओं द्वारा विरासत में मिली हैं।
तुलसी बॉर्क


0

JodaTime के साथ सबसे सरल तरीका

DateMidnight date = DateMidnight.now();


2
नहीं, "मध्यरात्रि" -रोडों-कक्षाओं और विधियों को जोडा-टाइम में चित्रित किया गया है। वे एक त्रुटिपूर्ण अवधारणा पर आधारित थे। दिन का पहला क्षण हमेशा नहीं होता है 00:00:00.000। इसके बजाय नई withTimeAtStartOfDayविधि का उपयोग करें । Joda-Time के वर्तमान संस्करण 2.4 में अपडेट करें और रिलीज़ नोट्स पढ़ें। उदाहरण:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
तुलसी बॉर्क

0

एक दिन 24 * 60 * 60 * 1000एमएस होने के कारण इस दिन की मध्यरात्रि की गणना की जा सकती है ...

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
यह कोड केवल UTC और अन्य समय क्षेत्र पर लागू नहीं होता है, और डेलाइट सेविंग टाइम जैसी विसंगतियों को अनदेखा करता है। इसके अलावा, रोल-योर-डेट-टाइम सॉल्यूशंस नासमझी है क्योंकि यह आश्चर्यजनक रूप से मुश्किल विषय है। इसके बजाय उत्कृष्ट java.time कक्षाओं का उपयोग करें।
तुलसी बोर्क

0

पहले के उत्तरों के अनुसार बहुत सुंदर, लेकिन किसी ने भी AM_PM पैरामीटर का उल्लेख नहीं किया:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

1
परेशानी Calendarवर्ग द्वारा साल पहले का स्थान ले लिया गया था java.time , वर्ग विशेष रूप से ZonedDateTime
तुलसी Bourque

0
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

यह केवल UTC के लिए काम करता है, और समय क्षेत्र को संबोधित करने में विफल रहता है। इसके अलावा, भयानक Dateवर्ग को वर्षों पहले दबा दिया गया था java.time.InstantDateआजकल के इस्तेमाल से बचें ।
तुलसी बोर्क

0

अपाचे कॉमन्स का उपयोग करना ।।

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

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

@BasilBourque जावा 8 के लिए सहमत। लेकिन अगर ओपी जावा 7 का उपयोग कर रहा है, तो मुझे लगता है कि यह अभी भी काम करेगा।
joe4java

लगभग सभी java.time कार्यक्षमता लगभग सभी समान एपीआई वाले थ्रीटेन-बैकपोर्ट प्रोजेक्ट में जावा 6 और 7 के लिए उपलब्ध है। थ्रीटेनाब प्रोजेक्ट में Android <26 के लिए और भी अनुकूलित । तो कभी भी फिर से उन पुराने पुराने समय की कक्षाओं का उपयोग करने की आवश्यकता नहीं है।
तुलसी बॉर्क

-1

मुझे पता है यह बहुत पुरानी पोस्ट है। मैंने अपना ज्ञान यहाँ साझा करने के लिए सोचा!

आज की मध्य रात्रि के लिए सटीक समय क्षेत्र के साथ आप निम्नलिखित का उपयोग कर सकते हैं

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

कहाँ पे (1000*60 * 330) घटाया जा रहा है अर्थात वास्तव में समय क्षेत्र से संबंधित उदाहरण के लिए भारतीय समय क्षेत्र अर्थात कोलकाता भिन्न +5: 30hrs वास्तविक से भिन्न है। इसलिए इसे घटाकर मिलीसेकंड में परिवर्तित किया जा रहा है।

इसलिए अपने अनुसार अंतिम स्थानापन्न संख्या बदलें। मैं केवल भारत में स्थित उत्पाद का निर्माण कर रहा हूं, इसलिए केवल विशिष्ट टाइमस्टैम्प का उपयोग किया जाता है।


1
आप स्वीकृत उत्तर के बजाय यह सुझाव क्यों देंगे? अपने दिनांक-समय के मूल्यों को रोल करना सामान्य रूप से जोखिम भरा है। विशेष रूप से यह कोड एक समय क्षेत्र के वर्तमान ऑफसेट के लिए हमेशा के लिए हार्ड-कोडित है। डेलाइट सेविंग टाइम या अन्य विसंगतियों का कोई हिसाब नहीं है। मैं केवल बिना किसी अतिरिक्त मूल्य के डाउनसाइड देखता हूं।
बेसिल बॉर्क

@ बासील मैं निश्चित रूप से उत्तर स्वीकार करता हूं और हां मैंने हार्ड कोडित मूल्य के लिए वहां उल्लेख किया है। यह केवल उस स्थिति में सहायक होता है जब आप एक विशिष्ट समय क्षेत्र पर काम कर रहे होते हैं।
राजीव

-1
Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

लेकिन खबरदार जो java.sql.Date.toInstant()हमेशा फेंकता है UnsupportedOperationException

के लिए LocalDate java.util.Date और इसके विपरीत सरलतम रूपांतरण?


नहीं एक अच्छा जवाब। आप आधुनिक जावा का उपयोग कर रहे हैं। पुराने विरासत वर्गों के साथ जो वे दबाते हैं। और विशेष रूप से आप java.sql तिथि-समय की कक्षाओं का उपयोग करते हैं जो केवल एक डेटाबेस के साथ डेटा का आदान-प्रदान करने के लिए उपयोग किया जाना चाहिए जिसका ड्राइवर अभी तक java.time कक्षाओं से सीधे निपटने के लिए अद्यतन नहीं किया गया है, कभी भी व्यावसायिक तर्क के लिए उपयोग नहीं किया जाना चाहिए। फिर भी एक और समस्या यह है कि आप समय क्षेत्र के महत्वपूर्ण मुद्दे की अनदेखी करते हैं।
तुलसी बॉर्क

@ बासिलबोर्क, समालोचना के लिए धन्यवाद। एक विरासत श्रेणी का उपयोग करना, जिसे एक और विरासत वर्ग उदाहरण प्राप्त करने के लिए पदावनत के रूप में चिह्नित नहीं किया गया है, काफी सुरक्षित है। समयक्षेत्र का मुद्दा अधिक महत्वपूर्ण है। मैंने आखिरकार रिकार्डो के जवाब के साथ रहने का फैसला किया ।
वडज़िम

-1

पुराने जमाने का तरीका..

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

उस तकलीफदेह वर्ग को वर्षों पहले java.time.Instant वर्ग द्वारा दबा दिया गया था । कभी उपयोग करने की आवश्यकता नहीं है Date
बेसिल बॉर्क

वह Dateवर्ग हमेशा यूटीसी में होता है। इसलिए आप वांछित / अपेक्षित समय क्षेत्र के मुद्दे की अनदेखी कर रहे हैं। उदाहरण के लिए, कोलकाता में एक नया दिन यूटीसी की तुलना में कई घंटे पहले और मॉन्ट्रियल क्यूबेक में यूटीसी की तुलना में घंटों बाद शुरू होता है।
बेसिल बोर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.