2011-02-04 16 views
15

मेरे पास जैस्पर रिपोर्ट्स में एक रिपोर्ट बनाई गई है जो केवल java.util.Date (कैलेंडर या ग्रेगोरियन नहीं) को पहचानती है।java.util.Date: सात दिन पहले

क्या वर्तमान तिथि से 7 दिन पहले कोई तारीख बनाने का कोई तरीका है?

आदर्श रूप में, यह कुछ इस तरह दिखेगा:

new Date(New Date() - 7) 

अद्यतन: मैं इस के लिए पर्याप्त जोर नहीं कर सकते हैं: JasperReports जावा कैलेंडर वस्तुओं को नहीं पहचानता।

+1

कैलेंडर बनाने के लिए, तारीख तय ('Calendar.setTime (तिथि) '),' Calendar.add (कैलेंडर। DAY_OF_YEAR, -7) ',' calendar.getTime() '... इतना बहुत खास क्या है? या सिर्फ नई तारीख (डी .getTime() - TimeUnit.DAYS.toMillis (7)) – bestsss

+0

जैसा कि मुझे बताया जा रहा है "7 दिन पूर्व" एक अपरिहार्य नमूना हो सकता है। डेलाइट सेविंग टाइम से प्रभावित लोगों के लिए, यदि '7 दिन पूर्व 'से, तो आपका मतलब है कि यदि 14 मार्च 2010 को दोपहर 12 बजे दोपहर है, तो आप 7 मार्च को 12 बजे के परिणामस्वरूप' 7 दिन पूर्व 'की गणना चाहते हैं। 2010', फिर उन उत्तरों के बारे में सावधान रहें जो वास्तव में 168 घंटे के रूप में '7 दिन पूर्व' का इलाज करते हैं। आपके द्वारा '7 दिन पूर्व' का अर्थ हमेशा '168 घंटे 'नहीं होता है जब डीएसटी आपके लिए शुरू या समाप्त हो सकता है। –

उत्तर

44

वास्तव में अब से:

long DAY_IN_MS = 1000 * 60 * 60 * 24; 
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS)) 

मनमाना Date date से:

new Date(date.getTime() - (7 * DAY_IN_MS)) 

संपादित करें: के रूप में अन्य उत्तर में बताया, खाता नहीं है डेलाइट बचत समय के लिए, अगर यह एक कारक है।

बस उस सीमा के बारे में मैं बात कर रहा था स्पष्ट करने के लिए:

डेलाइट सेविंग टाइम, से प्रभावित लोगों के लिए 7 days earlier से, तुम्हारा मतलब है कि अगर अभी 12pm noon on 14 Mar 2010 है, तो आप 7 days earlier की गणना चाहते हैं परिणामस्वरूप 12pm on 7 Mar 2010, फिर सावधान रहें।

यह समाधान दिनांक 24 घंटे * 7 दिन = 168 घंटे पहले दिनांक/समय पाता है।

हालांकि, कुछ लोगों जब इस समाधान पाता है कि, उदाहरण के लिए, (14 Mar 2010 1:00pm) - 7 * DAY_IN_MSमई वापसी (7 Mar 2010 12:00pm) में एक परिणाम है, जहां आपके समय क्षेत्र में दीवार-घड़ी समय नहीं ही है आश्चर्यचकित हैं 2 दिनांक/समय (1pm बनाम 12pm) के बीच। यह उस रात को शुरू करने या समाप्त करने के लिए डेलाइट बचत समय और "दीवार घड़ी का समय" खोने या एक घंटे प्राप्त करने के कारण होता है।

यदि डीएसटी आपके लिए कारक नहीं है या यदि आप वास्तव में (168 hours) चाहते हैं (दीवार घड़ी के समय में बदलाव के बावजूद), तो यह समाधान ठीक काम करता है।

अन्यथा, आपको 7 days earlier वास्तव में वास्तव में 168 घंटे का मतलब नहीं है (डीएसटी शुरू होने या उस समय सीमा के भीतर समाप्त होने के कारण) की क्षतिपूर्ति करने की आवश्यकता हो सकती है।

+1

असल में यह डेलाइट सेविंग के लिए खाता है। – bestsss

+0

@bestsss - मेरे अपने जवाब में छेद नहीं डालना है, लेकिन एक दिन में 1 दिन है जो एक मानक दिन की तुलना में बिल्कुल 1 घंटा छोटा ("वसंत फॉरवर्ड") होता है और एक वर्ष में 1 दिन जो 1 घंटे लंबा होता है ("वापस गिरना ") एक मानक दिन से। इन मामलों में, हम उम्मीद से 6 दिन और 23 घंटे पहले या 7 दिन और 1 घंटा पहले दिखाई देंगे। मैं वास्तव में इस समाधान के साथ इस समस्या से काटा गया है। –

+1

@ बर्ट एफ, यह इस बात पर निर्भर करता है कि आप उस समय को कैसे देखते हैं। 7 * DAY_IN_MS मिलिस में ठीक 7 दिन है। यदि आप 7 दिनों पहले एक विशिष्ट टाइमज़ोन पर समय देख रहे हैं, तो समय क्षेत्र को संदर्भ में निर्दिष्ट किया जाना चाहिए। W/o एक टाइमज़ोन निर्दिष्ट है कि उत्तर ठीक है। कुंजी मिलिस भाग स्वरूपण और एक टाइमज़ोन प्रभाव में ले जाने में डालता है। – bestsss

23

उपयोग कैलेंडर की सुविधा getTime() का उपयोग कर नए दिनांक वस्तुओं को बनाने के:

import java.util.GregorianCalendar; 
import java.util.Date; 

Calendar cal = new GregorianCalendar(); 
cal.add(Calendar.DAY_OF_MONTH, -7); 
Date sevenDaysAgo = cal.getTime(); 
+2

प्रश्न बताता है कि आप कैलेंडर का उपयोग नहीं कर सकते हैं। –

+2

@Dusty: यह निर्दिष्ट नहीं करता है कि तारीख को रिपोर्ट कैसे प्राप्त होती है। मैंने इस शब्द से धारणा की कि अंतिम परिणाम एक दिनांक वस्तु होना चाहिए, लेकिन कैलेंडर का उपयोग बीच में किया जा सकता है। – Powerlord

+0

ठीक है, अच्छा, मैं देखता हूं कि इसे इस तरह कैसे पढ़ा जा सकता है। मैंने इसका मतलब यह लिया कि कैलेंडर के लिए कोई समर्थन नहीं है। मैं एक जीडब्ल्यूटी परियोजना पर काम कर रहा हूं जिसमें समान आवश्यकताएं हैं। –

13

कोशिश

Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000)); 

एक और तरीका है कैलेंडर का उपयोग करने के लिए है, लेकिन मैं इसे अपने आप का उपयोग कर पसंद नहीं है।

+1

डेलाइट सेविंग तिथियों पर बग्गी होगी –

+1

अगर रिपोर्ट रात भर की नौकरी है 11 और 1 के बीच यह हर साल एक सप्ताह के लिए गलत होगा। :) – Affe

+0

* रातोंरात क्रॉन नौकरी :) –

6

इस प्रयास करें:

Calendar c = Calendar.getInstance(); 
c.add(Calendar.DAY_OF_MONTH, -7); 
return c.getTime(); 
+0

ऐड विधि शून्य लौटाती है, इसका संदर्भ किस संदर्भ में होगा? – Gilberto

+0

@ पीटर, मुझे यकीन नहीं है कि मुझे कहां मिला है 'कैलेंडर # एड' धाराप्रवाह था, लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं चारों ओर लटक रहा हूं। बहुत ज्यादा। 'कैलेंडर # AddDays' और 'डेटटाइम # AddDays' दोनों वहां धाराप्रवाह हैं। –

+0

मेरी इच्छा है कि जावा में जहां ... में आसान रहना होगा .... धन्यवाद .. –

0

वहाँ एक कारण यह है कि आप अपने समर्थन की फलियों में एक गणना नहीं कर सकते है? फिर इसे अपनी रिपोर्ट में पैरामीटर के रूप में भेजें।

0

गहन विचार-विमर्श के कारण:

सवाल w/ओ एक निर्दिष्ट समय क्षेत्र एक उचित जवाब नहीं हो सकता है।

इसके नीचे

डब्ल्यू/डिफ़ॉल्ट (और इसलिए हटा दिया गया) समय क्षेत्र को ध्यान में डिफ़ॉल्ट समय क्षेत्र डेलाइट सेविंग लेता है काम करने के लिए कुछ कोड है।

Date date= new Date(); 
date.setDate(date.getDate()-7);//date works as calendar w/ negatives 

जबकि समाधान काम करता है, यह टाइमज़ोन मानने के मामले में बिल्कुल दबदबा है।

new Date(System.currentTimeMillis() - 10080*60000);//a week has 10080 minutes 

कृपया, उत्तर के लिए वोट न दें।

+0

सच है, डेलाइट सेविंग टाइम और अन्य विसंगतियों को संभालने के लिए समय क्षेत्र महत्वपूर्ण है। Joda-time या java.time का उपयोग करने का एक कारण java.util.Date की बजाय इतना महत्वपूर्ण है। –

+0

@ बेसिलबोरक, व्यक्तिगत रूप से मुझे कभी भी जोड की आवश्यकता नहीं है। juDate, खुद, एक बेकार वर्ग है लेकिन juCalendar ठीक काम करता है - हालांकि थोड़ा अजीब है लेकिन 1 999 से इसका उपयोग करने के लिए मैं अच्छी तरह से उपयोग कर रहा हूं ... – bestsss

+1

जावाडोक कहता है कि 'सेटडेट' के लिए पैरामीटर 1 से एक पूर्णांक होना चाहिए -31 (समावेशी) और नकारात्मक संख्याओं के लिए किसी भी विशेष व्यवहार को परिभाषित नहीं करता है। सिर्फ इसलिए कि यह एक जेवीएम/संस्करण में काम करता है यह गारंटी नहीं देता है कि यह कहीं और काम करेगा। यदि आप इनमें से किसी एक का उपयोग करना चाहते हैं तो मिलीसेकंड के साथ उदाहरण अधिक विश्वसनीय है। –

2

मुझे यकीन नहीं है कि उन्होंने इन्हें कब जोड़ा, लेकिन जैस्पर रीपॉर्ट्स का अपना "फ़ंक्शन" सेट है जो तिथियों में हेरफेर कर सकता है।

DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()) - 7) 

कि तिथि आज से 7 दिन के लिए सेट के साथ एक java.util.Date बनाता है: यहाँ एक उदाहरण है कि मैं अच्छी तरह से परीक्षण नहीं किया है। यदि आप एक अलग "एंकर" तिथि का उपयोग करना चाहते हैं, तो आप जिस भी तारीख का उपयोग करना चाहते हैं, उसके साथ बस TODAY() को प्रतिस्थापित करें।

2

निर्धारित करने के लिए "दिन" को समय क्षेत्र की आवश्यकता होती है। एक समय क्षेत्र परिभाषित करता है जब "दिन" शुरू होता है। एक समय क्षेत्र में डेलाइट सेविंग टाइम और अन्य विसंगतियों को संभालने के नियम शामिल हैं। समय क्षेत्र अप्रासंगिक बनाने के लिए कोई जादू नहीं है। यदि आप इस मुद्दे को अनदेखा करते हैं, तो JVM का डिफ़ॉल्ट समय क्षेत्र लागू किया जाएगा। यह भ्रम और दर्द का कारण बनता है।

बचें java.util.Date

java.util.Date और .Calendar कक्षाएं बेहद परेशानी में हैं। उनसे बचें। वे इतने बुरे हैं कि सूर्य/ओरेकल उन्हें जावा 8 में नए java.time package के साथ आपूर्ति करने पर सहमत हुए। या तो उस या Joda-Time का उपयोग करें।

Joda समय

उदाहरण Joda समय 2.3 में कोड।

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); // Specify or else the JVM's default will apply. 
DateTime dateTime = new DateTime(new java.util.Date(), timeZone); // Simulate passing a Date. 
DateTime weekAgo = dateTime.minusDays(7); 

दिवस

या, आप इतनी के रूप में समय के एक पूरे दिन के मूल्य पर कब्जा करने के दिन के पहले पल के लिए समय दिन-का-समायोजित करना चाहते मई के पहले पल। विधि withTimeAtStartOfDay पर कॉल करें। ध्यान रखें कि यह आमतौर पर 00:00:00 है लेकिन हमेशा नहीं।

बचें Joda समय में "आधी रात" तरीकों और वर्गों। वे एक दोषपूर्ण अवधारणा पर आधारित हैं और अब बहिष्कृत हैं।

DateTime dateTimeStart = new DateTime(new java.util.Date(), timeZone).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00". 
DateTime weekAgo = dateTime.minusDays(7).withTimeAtStartOfDay(); 

कन्वर्ट करने के लिए/j.u.Date

जैसा कि ऊपर देखा, java.util.Date से Joda समय में बदलने के लिए केवल दिनांक समय के निर्माता के लिए दिनांक वस्तु पारित से। समझें कि एक j.u.Date में कोई समय क्षेत्र नहीं है, दिनांक दिनांक करता है। तो यह तय करने के लिए वांछित/उपयुक्त समय क्षेत्र असाइन करें कि "दिन" क्या हैं और जब वे शुरू होते हैं।

दूसरी तरफ जाने के लिए, दिनांक समय से j.u.Date तक, बस toDate विधि पर कॉल करें।

java.util.Date date = dateTime.toDate(); 
+0

मज़ाकिया, जोडा-टाइम उदाहरण में, 'java.util.Date' का उपयोग किया जाता है ...: पी – Stephan

+0

@Stephan वास्तव में बहुत मजेदार नहीं है। प्रश्न कहता है कि 'java.util.Date' विशेष रूप से * जैस्पर रीपॉर्ट्स * लाइब्रेरी के उपयोग के लिए आवश्यक है। ऐसे कई पुस्तकालय केवल j.u.Date के साथ काम करते हैं। तो आमतौर पर हम जोडा-टाइम (या जावा.टाइम) में काम का बड़ा हिस्सा करते हैं और फिर अंत में j.u.Date में परिवर्तित होते हैं। जोडा-टाइम और जावा.टाइम दोनों आगे और पीछे परिवर्तित करने के लिए सुविधा विधियों की पेशकश करते हैं। एक विद्युत पावर एडाप्टर का उपयोग करने की तरह। सालों से, उम्मीद है कि हम पुस्तकालयों के रूप में j.u.Date fade का उपयोग देखेंगे [java.time] (http://docs.oracle.com/javase/tutorial/datetime/index.html)। –

+0

मुझे यकीन नहीं है कि जोडाटाइम/जेएसआर 310 की आवश्यकता है, यहां: यह सब अपेक्षाकृत आसानी से 'java.util.Calendar' के साथ किया जा सकता है। हां, जोडाटाइम/जेएसआर 310 के लिए इंटरफ़ेस बहुत अच्छा है, लेकिन इसके लिए या तो आपके आवेदन के लिए एक शर्त के रूप में जोडाटाइम या जावा 8 की आवश्यकता होगी, जो संभव नहीं हो सकता है। –

3

के बाद से कोई भी अभी तक TimeUnit उल्लेख किया है:

new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7)) 
0

मैं इसे इस तरह से कर रहा हूँ:

Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH), -7); 
संबंधित मुद्दे