जावा कैलेंडर का उपयोग करते हुए एक तारीख से एक्स दिनों को कैसे घटाया जाए?


180

किसी को एक तारीख से एक्स दिनों को घटाने के लिए जावा कैलेंडर का उपयोग करने का एक सरल तरीका पता है?

मुझे कोई भी ऐसा कार्य नहीं मिला है जो मुझे जावा में एक तारीख से सीधे एक्स दिनों को हटाने की अनुमति देता हो। क्या कोई मुझे सही दिशा की ओर इशारा कर सकता है?


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

जवाबों:


309

यहां डॉक्स से लिया गया :

कैलेंडर के नियमों के आधार पर, दिए गए कैलेंडर फ़ील्ड में समय की निर्दिष्ट मात्रा को जोड़ता या घटाता है। उदाहरण के लिए, कैलेंडर के वर्तमान समय से 5 दिन घटाने के लिए, आप इसे कॉल करके प्राप्त कर सकते हैं:

Calendar calendar = Calendar.getInstance(); // this would default to now
calendar.add(Calendar.DAY_OF_MONTH, -5).

1
बस इसे करने से सावधान रहें क्योंकि यह हमेशा की तरह रोल नहीं करता है जैसा कि आप इसे करने की उम्मीद करते हैं।
कार्सन

1
इस उत्तर में कई उत्थान हैं, लेकिन क्या यह उपयोग करना सुरक्षित है? या यह बेहतर है: stackoverflow.com/a/10796111/948268
कुलदीप जैन

44
आप Calendar.DAY_OF_MONTHइस मामले में उपयोग नहीं करेंगे क्योंकि यह महीनों के बीच रोल को संभाल नहीं पाएगा जैसा आप करना चाहते हैं। Calendar.DAY_OF_YEARइसके बजाय का उपयोग करें
एल्गोरिदम

4
यह सुरक्षित होना चाहिए, जाहिरा तौर पर जब आप इसे जोड़ रहे हैं तो इससे कोई फर्क नहीं पड़ता कि यह DAY_OF_MONTH या DAY_OF_YEAR stackoverflow.com/q/14065198/32453
rogerdpack

@ कारसन इस दृष्टिकोण के साथ कुछ समस्याएं हैं?
तातमानब्लू

38

आप addविधि का उपयोग कर सकते हैं और इसे एक नकारात्मक संख्या दे सकते हैं। हालाँकि, आप एक सरल विधि भी लिख सकते हैं Calendarजो निम्न जैसे वर्ग का उपयोग नहीं करता है

public static void addDays(Date d, int days)
{
    d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}

यह तिथि (समय के बाद के मिलीसेकंड) का टाइमस्टैम्प मान प्राप्त करता है और उचित संख्या में मिलीसेकंड जोड़ता है। आप घटाव करने के लिए दिनों के पैरामीटर के लिए एक नकारात्मक पूर्णांक पारित कर सकते हैं। यह "उचित" कैलेंडर समाधान की तुलना में सरल होगा:

public static void addDays(Date d, int days)
{
    Calendar c = Calendar.getInstance();
    c.setTime(d);
    c.add(Calendar.DATE, days);
    d.setTime( c.getTime().getTime() );
}

ध्यान दें कि ये दोनों समाधान Dateपूरी तरह से नया लौटने के बजाय पैरामीटर के रूप में पारित वस्तु को बदलते हैं Date। या तो फ़ंक्शन को आसानी से बदला जा सकता है, यदि वांछित है तो इसे दूसरे तरीके से किया जा सकता है।


3
विश्वास मत करो .setTime और .add कैलेंडर के स्थिर तरीके हैं। आपको उदाहरण चर c का उपयोग करना चाहिए।
एडवर्ड

@ एडवर्ड: आप सही हैं, मेरी गलती को इंगित करने के लिए धन्यवाद, मैंने कोड तय कर दिया है ताकि यह अब ठीक से काम करे।
एली कोर्टराइट 15

3
उदाहरण के लिए पहले तरीके से सावधान रहें, उदाहरण के लिए जब खसखस ​​के दिनों के साथ काम करना विफल हो सकता है: stackoverflow.com/a/1006388/32453
rogerdpack

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

36

Anson का जवाब साधारण मामले के लिए ठीक काम करेगा, लेकिन अगर आप किसी और जटिल तारीख की गणना करने जा रहे हैं तो मैं Joda Time की जाँच करने की सलाह दूंगा । यह आपके जीवन को बहुत आसान बना देगा।

Joda समय में FYI करें आप कर सकते हैं

DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);

1
@ShahzadImam, बाहर की जाँच DateTimeFormat । यह आपको मनमाने स्वरूपों का उपयोग करके डेटटाइम इंस्टेंस को स्ट्रिंग्स में बदलने की अनुमति देगा। यह java.text.DateFormat वर्ग के समान है।
माइक डेक

1
जावा 8 के अनुसार java.time docs.oracle.com/javase/8/docs/api/java/time/…
toidiu

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

19

tl; डॉ

LocalDate.now().minusDays( 10 )

समय क्षेत्र निर्दिष्ट करने के लिए बेहतर है।

LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )

विवरण

जावा के शुरुआती संस्करणों के साथ बंडल किए गए पुराने दिनांक-समय की कक्षाएं, जैसे java.util.Date/ .Calendar, परेशानी, भ्रामक और त्रुटिपूर्ण साबित हुई हैं। इनसे बचें।

java.time

जावा 8 और बाद में नए java.time ढांचे के साथ उन पुराने वर्गों को दबा देता है। ट्यूटोरियल देखें । जेएसआर 310 द्वारा परिभाषित , जोडा-टाइम से प्रेरित और थ्रीटेन-एक्स्ट्रा प्रोजेक्ट द्वारा विस्तारित । थ्रीटेन-बैकपोर्ट परियोजना को जावा 6 और 7 में कक्षाओं को बैक-पोर्ट करता है; Android के लिए तीनTENABP परियोजना।

प्रश्न अस्पष्ट है, स्पष्ट नहीं है यदि यह केवल तारीख या तारीख के लिए पूछता है।

LocalDate

केवल दिनांक के लिए, दिन के समय के बिना, LocalDateकक्षा का उपयोग करें । ध्यान दें कि "आज" जैसे किसी तिथि को निर्धारित करने में महत्वपूर्ण समय क्षेत्र।

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );

ZonedDateTime

यदि आपके पास दिनांक-समय का मतलब है, तो यूटीसीInstant में समय पर पल पाने के लिए कक्षा का उपयोग करें । वहां से, ऑब्जेक्ट प्राप्त करने के लिए एक समय क्षेत्र में समायोजित करें ।ZonedDateTime

Instant now = Instant.now();  // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );

जावा में तिथि-समय प्रकारों की तालिका, दोनों आधुनिक और विरासत।


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

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

addDaysएली द्वारा सुझाए गए अनुसार अपना लिखने के बजाय , मैं अपाचेDateUtils से उपयोग करना पसंद करूंगा । यह विशेष रूप से तब उपयोगी होता है जब आपको इसे अपने प्रोजेक्ट में कई स्थानों पर उपयोग करना होता है।

एपीआई का कहना है:

addDays(Date date, int amount)

एक नई वस्तु को लौटाने के लिए कई दिनों की तारीख जोड़ता है।

ध्यान दें कि यह एक नई Dateवस्तु लौटाता है और पिछले एक में बदलाव नहीं करता है।


2

इसे निम्न द्वारा आसानी से किया जा सकता है

Calendar calendar = Calendar.getInstance();
        // from current time
        long curTimeInMills = new Date().getTime();
        long timeInMills = curTimeInMills - 5 * (24*60*60*1000);    // `enter code here`subtract like 5 days
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

        // from specific time like (08 05 2015)
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        calendar.set(Calendar.MONTH, (5-1));
        calendar.set(Calendar.YEAR, 2015);
        timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
        calendar.setTimeInMillis(timeInMills);
        System.out.println(calendar.getTime());

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

1

किसी ने Joda Time की सिफारिश की - मैं इस CalendarDate वर्ग http://calendardate.sourceforge.net का उपयोग कर रहा हूं

यह जोडा टाइम के लिए कुछ हद तक प्रतिस्पर्धी परियोजना है, लेकिन केवल 2 वर्गों में बहुत अधिक बुनियादी है। यह बहुत उपयोगी है और मुझे जो कुछ भी चाहिए, उसके लिए बहुत अच्छा काम किया क्योंकि मैं अपनी परियोजना से बड़े पैकेज का उपयोग नहीं करना चाहता था। जावा समकक्षों के विपरीत, इसकी सबसे छोटी इकाई दिन है इसलिए यह वास्तव में एक तारीख है (इसे मिलीसेकंड या कुछ नीचे करने के लिए नहीं)। एक बार जब आप तारीख बना लेते हैं, तो आप जो घटाते हैं वह कुछ ऐसा होता है जैसे 5 दिन वापस जाने के लिए myDay.addDays (-5)। आप इसका उपयोग सप्ताह के दिन और उस तरह की चीजों को खोजने के लिए कर सकते हैं। एक और उदाहरण:

CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);

तथा:

//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
    dayLabel = cdf.format(currDay);
    if (currDay.equals(today))
        dayLabel = "Today";//print "Today" instead of the weekday name
    System.out.println(dayLabel);
    currDay = currDay.addDays(1);//go to next day
}

1

मेरा मानना ​​है कि किसी भी समय इकाई (महीने, दिन, घंटे, मिनट, सेकंड, ...) को घटाव या इसके अलावा करने का एक अच्छा और अच्छा तरीका java.time.stant वर्ग का उपयोग करके प्राप्त किया जा सकता है ।

वर्तमान समय से 5 दिन घटाने और दिनांक के रूप में परिणाम प्राप्त करने के लिए उदाहरण:

new Date(Instant.now().minus(5, ChronoUnit.DAYS).toEpochMilli());

1 घंटा घटाने और 15 मिनट जोड़ने का एक और उदाहरण:

Date.from(Instant.now().minus(Duration.ofHours(1)).plus(Duration.ofMinutes(15)));

यदि आपको अधिक सटीकता की आवश्यकता है, तो इंस्टेंस ने नैनोसेकंड तक उपाय किया। नैनोसेकंड भाग में हेरफेर करने के तरीके:

minusNano()
plusNano()
getNano()

इसके अलावा, ध्यान रखें कि वह तारीख इंस्टेंट की तरह सटीक नहीं है।


1
या स्वाद पर निर्भर करता है, थोड़ा कम:Date.from(Instant.now().minus(5, ChronoUnit.DAYS))
ओले वीवी

1
अच्छा! तुम सही हो। मैंने वास्तव में इस का उपयोग करने के उत्तर को अपडेट किया और java.time। अवधि वर्ग का उपयोग भी दिखाया, जो इस मामले में भी बहुत शक्तिशाली है।
योरदन बोव

0

एली कोर्टराइट दूसरा समाधान गलत है, यह होना चाहिए:

Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());

2
एली के समाधान में फ़ंक्शन का नाम है addDays; उसका समाधान सही है। यदि आप तिथि से दिनों को घटाना चाहते हैं, तो आप इसके लिए ऋणात्मक मान से गुजरते हैं days
थॉमस अप्टन

खैर, यह कुछ ऐसा है जो प्रोग्रामर को फ़ंक्शन बनाते समय निर्दिष्ट करना है, नहीं? : पी
user178973
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.