2011-06-29 13 views
19

यह मानते हुए कि कैसे आप Joda time में वर्तमान समय मिलता है:जावा में जोडा तिथि/समय पुस्तकालय का उपयोग करके "आज" के लिए दिनांक/समय सीमा कैसे प्राप्त होती है?

DateTime now = new DateTime(); 

कैसे आप चर dateTimeAtStartOfToday और dateTimeAtEndOfToday के लिए मूल्यों की गणना करते हैं?

जो मैं करने की कोशिश कर रहा हूं वह startOfToday और endOfToday के बीच हुए सभी लेनदेन की तलाश करने के लिए कुछ SQL उत्पन्न करता है।

उत्तर

32

मैं का प्रयोग करेंगे:

LocalDate today = now.toLocalDate(); 
LocalDate tomorrow = today.plusDays(1); 

DateTime startOfToday = today.toDateTimeAtStartOfDay(now.getZone()); 
DateTime startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone()); 

फिर किसी विशेष समय के लिए करता है, तो startOfToday <= time < startOfTomorrow की जाँच करें।

बेशक

, यह आंशिक रूप से पर निर्भर करता है कि वास्तव में क्या डेटाबेस में संग्रह किया गया है -। और किस समय क्षेत्र में आपकी रुचि है

+0

मुझे लगता है, आपके पास एक टाइपो है। आप दिन की शुरुआत पढ़ने के लिए दो बार 'आज' का उपयोग करते हैं ... – nfechner

+0

@nfechner: फिक्स्ड, धन्यवाद। –

+0

इस उत्तर में उपरोक्त कोड में "<=" बनाम "<" के उपयोग पर ध्यान दें। इसे "हाफ-ओपन" दृष्टिकोण के रूप में जाना जाता है, जहां शुरुआत * समावेशी * है जबकि अंत * अनन्य * है। यह दृष्टिकोण समय की अवधि को परिभाषित करने का एक बुद्धिमान तरीका है। इसके अलावा, ['अंतराल'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) जोडा-टाइम में कक्षा का उपयोग डेटटाइम ऑब्जेक्ट्स की जोड़ी को ट्रैक करने के लिए किया जा सकता है इस उत्तर के कोड में परिभाषित किया गया है। अंतराल वर्ग तुलना करते समय हाफ-ओपन दृष्टिकोण का उपयोग करता है ('युक्त ',' ओवरलैप', 'गैप'' और 'abuts')। –

0
import org.joda.time.DateTime; 
import org.joda.time.DateTimeMidnight; 

DateTime dateTimeAtStartOfToday = new DateTime(new DateTimeMidnight()); 
DateTime dateTimeAtEndOfToday = new DateTime((new DateTimeMidnight()).plusDays(1)); 
+3

मैं डीएसटी परिवर्तनों के कारण, * डेटटाइम मिडनाइट 'का उपयोग करके * नहीं * सुझाव देता हूं क्योंकि * हमेशा मध्यरात्रि नहीं होता है। –

+0

@ जोन्स स्केट मैंने कभी मध्यरात्रि नहीं देखा है। हमेशा 2:00 - 3:00 बजे नहीं होता है, लेकिन हमेशा मध्यरात्रि होता है। या यह सिर्फ एक अमेरिकी चीज है? –

+2

@ बॉब: यह सिर्फ एक अमेरिकी चीज है। स्थानीय नियमों के मुताबिक डेलाइट सेविंग चेंज किसी भी समय हो सकता है। मुझे कठिन रास्ता मिल गया। –

0

यह काम करता है ...

DateTime dt = new DateTime(); 
DateMidnight dtStartDate = dt.toDateMidnight(); 
DateMidnight dtEndDate = dt.plusDays(1).toDateMidnight(); 
System.out.println(dt + "\n" + dtStartDate + "\n" + dtEndDate); 

... लेकिन जहाँ तक एसक्यूएल के रूप में, मैं जहां खंड के रूप में के बीच का उपयोग करने के बजाय> और आधी रात के लिए बाहर आधी रात < = सामान

+0

यह एक अपवाद फेंक देगा यदि दो तिथियों में से एक में डीएसटी परिवर्तनों के कारण मध्यरात्रि नहीं है। toDateTimeAtStartOfDay बेहतर आईएमओ है। –

+0

आप जानते हैं, मैं अपवाद का पुनरुत्पादन नहीं कर सकता जिसके बारे में आप बोलते हैं। प्रक्रिया में, डेटमिडनाइट के साथ काम करना उपर्युक्त सभी की तुलना में बेहतर है क्योंकि इसमें अंतराल() विधि है जो आसानी से डीएसटी संक्रमण के लिए जिम्मेदार है। मैं इस समाधान को एक अलग उत्तर के रूप में जोड़ रहा हूं। –

+1

एक समय क्षेत्र खोजें जो मध्यरात्रि में आगे बढ़ता है। आईआईआरसी, दक्षिण अमेरिका में कहीं ऐसा करता है - जैसा कि मैंने कड़ी मेहनत की है ... –

3

यह बेहतर काम करता है, यह पता चला है दिनांक समय एक तरीका है जिसके इस सटीक बात करता toInterval कहा जाता है (आंकड़े करते)। मेरे परीक्षणों में, ऐसा लगता है कि डीएसटी संक्रमणों में कोई समस्या नहीं है।

DateTime now = new DateTime(); 
DateTime startOfToday = now.toDateMidnight().toInterval().getStart(); 
DateTime endOfToday = now.toDateMidnight().toInterval().getEnd(); 
System.out.println("\n" + now + "\n" + startOfToday + "\n" + endOfToday + "\n"); 

जोडा बहुत अच्छी तरह से सोचा जाता है।

+5

डेटमिडनाइट [बहिष्कृत] था (http: //www.joda।मध्यरात्रि के मुद्दों के कारण संगठन/joda-time/apidocs/org/joda/time/DateMidnight.html)। सुझाव [withTimeAtStartOfDay] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()) विधि का उपयोग करना है –

1
if((sinceDate.getDayOfYear() == now.getDayOfYear()) && (sinceDate.year() == now.year())) 
    //yep, do something today; 

मेरे लिए काम करता है।

संबंधित मुद्दे