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




calendar subtraction (9)

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

मैं कोई भी फ़ंक्शन नहीं ढूंढ पा रहा हूं जो मुझे जावा में किसी तारीख से X दिन को सीधे घटाने की अनुमति देता है। क्या कोई मुझे सही दिशा में इंगित कर सकता है?


Answers

tl; डॉ

LocalDate.now().minusDays( 10 )

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

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

विवरण

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

java.time

जावा 8 और बाद में उन पुराने वर्गों को नए जावा.टाइम फ्रेमवर्क के साथ सप्लांट करता है। Tutorial देखें। Joda-Time द्वारा प्रेरित जेएसआर 310 द्वारा परिभाषित, और ThreeTen-Extra प्रोजेक्ट द्वारा विस्तारित किया गया। थ्रीटेन-बैकपोर्ट प्रोजेक्ट कक्षाओं को जावा 6 और 7 में बैक-पोर्ट करता है; Android के लिए ThreeTenABP परियोजना।

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

LocalDate

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

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

ZonedDateTime

यदि आपका डेट-टाइम का मतलब है, तो UTC में टाइमलाइन पर एक पल पाने के लिए 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 और बाद में बनाया गया है। ये कक्षाएं परेशानी पुरानी legacy दिनांक-समय कक्षाओं जैसे java.util.Date , Calendar , और SimpleDateFormat

Joda-Time प्रोजेक्ट, अब रखरखाव मोड में , java.time कक्षाओं में माइग्रेशन की सलाह देता है।

अधिक जानने के लिए, Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता जेएसआर 310 है

आप सीधे अपने डेटाबेस के साथ java.time ऑब्जेक्ट्स का आदान-प्रदान कर सकते हैं। जेडीबीसी 4.2 या बाद में एक जेडीबीसी ड्राइवर का अनुपालन करें। तारों की कोई ज़रूरत नहीं है, java.sql.* कक्षाओं की आवश्यकता नहीं है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • जावा एसई 8 , जावा एसई 9 , जावा एसई 10 , और बाद में
    • निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और फिक्सेस जोड़ता है।
  • जावा एसई 6 और जावा एसई 7
    • जावाटाइम की अधिकांश कार्यक्षमता को ThreeTen-Backport में जावा 6 और 7 में बैक-पोर्ट किया गया है।
  • Android
    • जावा.टाइम कक्षाओं के एंड्रॉइड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड (<26) के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) को अपनाने वाला है । देखें थ्रीटेबैप का उपयोग कैसे करें ...।

ThreeTen-Extra प्रोजेक्ट अतिरिक्त कक्षाओं के साथ जावा.टाइम बढ़ाता है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval , YearWeek , YearQuarter , more


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

यह जोदा समय के लिए कुछ हद तक प्रतिस्पर्धात्मक परियोजना है, लेकिन केवल 2 वर्गों में अधिक बुनियादी है। यह बहुत आसान है और मुझे जो चाहिए था उसके लिए बहुत अच्छा काम किया क्योंकि मैं अपने प्रोजेक्ट से बड़े पैकेज का उपयोग नहीं करना चाहता था। जावा समकक्षों के विपरीत, इसकी सबसे छोटी इकाई दिन है इसलिए यह वास्तव में एक तारीख है (इसे मिलीसेकंड या कुछ नहीं मिल रहा है)। एक बार जब आप तिथि बना लेते हैं, तो आप सब कुछ घटाते हैं, मेरे डेड.डडेज़ (-5) की तरह कुछ 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
}

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

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());

यहां दस्तावेज़ों से लिया गया:

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

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

int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);

संपादित करें: पार्सर जावाडोक के लिंक को पसंद नहीं करता है, इसलिए यहां यह सादे पाठ में है:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)


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

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

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

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

addDays(Date date, int amount)

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

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


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

जोडा समय में एफवाईआई आप कर सकते हैं

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

It ought to be possible to pack the 'cannot be a perfect square if the last X digits are N' much more efficiently than that! I'll use java 32 bit ints, and produce enough data to check the last 16 bits of the number - that's 2048 hexadecimal int values.

...

ठीक। Either I have run into some number theory that is a little beyond me, or there is a bug in my code. In any case, here is the code:

public static void main(String[] args) {
    final int BITS = 16;

    BitSet foo = new BitSet();

    for(int i = 0; i< (1<<BITS); i++) {
        int sq = (i*i);
        sq = sq & ((1<<BITS)-1);
        foo.set(sq);
    }

    System.out.println("int[] mayBeASquare = {");

    for(int i = 0; i< 1<<(BITS-5); i++) {
        int kk = 0;
        for(int j = 0; j<32; j++) {
            if(foo.get((i << 5) | j)) {
                kk |= 1<<j;
            }
        }
        System.out.print("0x" + Integer.toHexString(kk) + ", ");
        if(i%8 == 7) System.out.println();
    }
    System.out.println("};");
}

और यहां परिणाम हैं:

(ed: elided for poor performance in prettify.js; view revision history to see.)





java calendar subtraction