जावा में किसी डेट ऑब्जेक्ट से एक्स डे को कैसे घटाएं?


147

मैं कुछ ऐसा करना चाहता हूं:

Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"

यह कैसे करना है?


4
अप्रचलित "जोडा समय का उपयोग करें" टिप्पणी।
स्टीव मैकलियोड

1
निम्नलिखित लिंक आपके लिए उपयोगी हो सकते हैं। [यहां लिंक विवरण दर्ज करें] [1] [यहां लिंक विवरण दर्ज करें] [२] [१]: stackoverflow.com/questions/212321/… [२]: stackoverflow.com/questions/ 2623610 /…
अमी

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

जवाबों:


280

जावा 8 और बाद में

जावा 8 की तारीख समय एपीआई परिवर्तन के साथ, का उपयोग करें LocalDate

LocalDate date = LocalDate.now().minusDays(300);

इसी तरह आप कर सकते हैं

LocalDate date = someLocalDateInstance.minusDays(300);

Java.util.Date <-> java.time। के बीच अनुवाद के लिए https://stackoverflow.com/a/23885950/260990 का संदर्भ लें।

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

जावा 7 और उससे पहले

उपयोग Calendarकी add()विधि

Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();

22
यदि आप वर्तमान तिथि समय पर विचार नहीं करना चाहते हैं तो यह आपकी कस्टम तिथि निर्धारित करना है
जिगर जोशी

11
जावा की डेट हैंडलिंग इतनी फूला हुआ है!
डिगोरी डू

1
यह 4 साल पुराना जवाब है। इसके हाल के संस्करणों में नए DateTime एपीआई परिवर्तन किए गए हैं। मैं जवाब को संपादित करूंगा
जिगर जोशी

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

यदि आप जावा 8 एपीआई के साथ अपना जवाब अपडेट करते हैं तो @JigarJoshi यह बहुत अच्छा होगा। आपका उत्तर स्वीकृत है जिसे लोग पहले देखते हैं।
jotaen

47

@JigarJoshi यह अच्छा जवाब है, और निश्चित रूप से भी @Tim सिफारिश का उपयोग करने के लिए। Joda समय

मैं केवल a से दिनों को घटाना चाहता हूँ java.util.Date

अपाचे-कॉमन्स

एक संभावना अपाचे-कॉमन्स-लैंग का उपयोग करने की है । आप इसका उपयोग कर सकते हैंDateUtils निम्नानुसार :

Date dateBefore30Days = DateUtils.addDays(new Date(),-30);

निश्चित commons-langरूप से केवल तारीख घटाना करने के लिए निर्भरता जोड़ें, यह शायद एक अच्छा विकल्प नहीं है, हालांकि यदि आप पहले से ही commons-langइसका उपयोग कर रहे हैं तो यह एक अच्छा विकल्प है। सुविधाजनक विधियों के लिए भी है addYears, addMonths,addWeeks और इतने पर, पर एक नज़र डालें एपीआई यहाँ

जावा 8

एक और संभावना है कि जावा 8LocalDate से नई विधि का लाभ उठाया जाए।minusDays(long days)

LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);

LocalDateTimeजानबूझकर उस वर्ग का उपयोग करने का कोई मतलब नहीं है और न ही समय क्षेत्र और न ही ऑफसेट-यूटीसी की अवधारणा है। ज़ोन / ऑफ़सेट अज्ञात या प्रासंगिक नहीं होने पर ही उसका उपयोग करें। इसके बजाय जब इसकी विधि को बुलाते हैं तो उपयोग करें LocalDateऔर पास करें । याकूब वैन लिनन द्वारा सही उत्तर देखें । ZoneIdnow
तुलसी बोर्क

1
@BasilBourque आपकी सलाह के बाद, मैं एपीआई की जांच करता हूं और आप पूरी तरह से सही हैं, इसलिए मैं उत्तर को अपडेट करता हूं। धन्यवाद।
एल्बसिफ़

ब्रायन Montellano टिप्पणी करना चाहते हैं: कोई नहीं होना चाहिए sमें DateUtils, यह सिर्फ है DateUtil
ओले वीवी

@ OleV.V। ब्रायन DateUtils
मॉन्टेलानो

33

बस 300 दिनों से पहले की तारीख पाने के लिए इसका उपयोग करें, अपने दिनों के साथ 300 को बदलें:

Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();

यहाँ,

DateTime है org.joda.time.DateTime;

Date है java.util.Date


7
Joda समय परियोजना में है रखरखाव मोड , और के लिए प्रवास की सलाह है java.time कक्षाएं।
तुलसी बोर्के

13

जावा 8 टाइम एपीआई:

Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);

मुझे जावा 8 एपीआई का मतलब होना चाहिए, न कि 7. और पैकेज का उल्लेख करने से java.timeमदद मिल सकती है। साथ ही, केवल एक कोड स्निपेट के बजाय स्टैक ओवरफ्लो पर कुछ चर्चा / स्पष्टीकरण की उम्मीद की जाती है। आपको यह निश्चित Durationरूप से समझाना चाहिए कि वैन लिंगेन द्वारा मौजूदा एक पर आपके उत्तर का जोड़ा गया मूल्य है ।
बेसिल बॉर्क

जावा 8 कारण, निश्चित
ग्रिगोरी किसलिन

इतना करीब, लेकिन एक मनमाने ढंग से तारीख की वस्तु को संशोधित करने के लिए होना चाहिए, "अब" नहीं
bharal

9

जैसा कि आप देख सकते हैं कि यहाँ बहुत हेरफेर है जो आप कर सकते हैं। यहां एक उदाहरण दिखा रहा है कि आप क्या कर सकते हैं!

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();

//Add one day to current date.
cal.add(Calendar.DATE, 1);
System.out.println(dateFormat.format(cal.getTime()));

//Substract one day to current date.
cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(dateFormat.format(cal.getTime()));

/* Can be Calendar.DATE or
*  Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND
*/

@ जिगर जोशी: मैंने आपका जवाब नहीं देखा ... क्या मुझे अपना डिलीट करना चाहिए?
Waldyr.ar

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

9

जावा 8 के साथ अब यह वास्तव में सरल है:

 LocalDate date = LocalDate.now().minusDays(300);

नई एपीआई के लिए एक महान मार्गदर्शक यहां पाया जा सकता है


4
मेरा सुझाव है कि हमेशा वैकल्पिक समय क्षेत्र (या ऑफसेट-यूटीसी) से उस nowपद्धति को पारित करें । यदि छोड़ दिया जाता है, तो JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र निहित है और चुपचाप लागू किया जाता है। वह डिफ़ॉल्ट आपके नियंत्रण से बाहर है और रनटाइम के दौरान भी किसी भी समय बदल सकता है। उदाहरण: LocalDate.now( ZoneId.of( "America/Montreal" )
तुलसी बॉर्क

प्रश्न के अनुसार एक मनमाना दिनांक ऑब्जेक्ट पर होना चाहिए, "अभी" नहीं
bharal

1

मैंने कार्य को आसान बनाने के लिए एक फ़ंक्शन बनाया है।

  • DateString के बाद 7 दिनों के लिए: dateCalculate(dateString,"yyyy-MM-dd",7);

  • DateString तक 7 दिन पाने के लिए: dateCalculate(dateString,"yyyy-MM-dd",-7);


public static String dateCalculate(String dateString, String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    try {
        cal.setTime(s.parse(dateString));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    cal.add(Calendar.DATE, days);
    return s.format(cal.getTime());
}

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

प्रश्न में दिनांक-समय ऑब्जेक्ट्स शामिल हैं, स्ट्रिंग उत्पन्न नहीं कर रहे हैं। वैसे, LocalDate.parse( "2017-01-23").plusWeeks( 1 )अपनी खुद की विधि लिखने की तुलना में सरल है और अधिक स्व-दस्तावेजीकरण है।
बेसिल बोर्क

0

आप SimpleDateFormat के साथ कैलेंडर के साथ आसानी से घटा सकते हैं

 public static String subtractDate(String time,int subtractDay) throws ParseException {


        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH);
        cal.setTime(sdf.parse(time));
        cal.add(Calendar.DATE,-subtractDay);
        String wantedDate = sdf.format(cal.getTime());

        Log.d("tag",wantedDate);
        return wantedDate;

    }

-4
c1.set(2017, 12 , 01); //Ex: 1999 jan 20    //System.out.println("Date is : " + sdf.format(c1.getTime()));
  c1.add(Calendar.MONTH, -2); // substract 1 month
  System.out.println
  ("Date minus 1 month : "
      + sdf.format(c1.getTime()));

2
एसओ में आपका स्वागत है। कृपया कोड से केवल उत्तर देने से बचें। देखें stackoverflow.com/help/how-to-answer । और कृपया अपना कोड फॉर्मेट करें।
उवे एलेनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.