2009-05-26 19 views
13

संभव डुप्लिकेट:
How to determine the date one day prior to a given date in Java?जाओ पिछला दिन

अगर मैं एक Java.Util.Date वस्तु है, सबसे अच्छा तरीका है एक वस्तु का अतीत में 24 घंटे का प्रतिनिधित्व प्राप्त करने के लिए क्या है यह?

+2

डुपे: http://stackoverflow.com/questions/745443 –

+0

यदि यह प्रश्न 24 घंटे था और एक दिन नहीं था, तो यह एक डुप्ली नहीं हो सकता है। एक स्पष्टीकरण क्रम में होगा। – Yishai

+2

आपको अवगत होना चाहिए कि डेलाइट सेविंग टाइम के कारण, ऐसे दिन होते हैं जिनमें 23 या 25 घंटे होते हैं, इसलिए "पिछला दिन" "24 घंटे पहले" जैसा नहीं होता है। तिथियां खराब व्यवसाय हैं। –

उत्तर

38

जावा 1.6 java.util.Calendar.add का उपयोग करना:

public static Date subtractDay(Date date) { 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.DAY_OF_MONTH, -1); 
    return cal.getTime(); 
} 

दूसरों Joda Time, जो वर्तमान में JSR 310 है, और बाद में जावा अपने आप में शामिल किया जाना चाहिए का उपयोग कर सुझाव देते हैं।

+1

मैं विधि संदर्भ को हटा दूंगा - इसमें कुछ भी शामिल नहीं होता है और मुझे लचीलापन की कमी के लिए क्रिंग करता है। –

+0

1.6 में इसकी प्रतीक्षा कर रहा है ... जावा – miguel

-4

उस समय से 1000 * 60 * 60 * 24 घटाएं और एक नई तारीख बनाएं।

Date yesterday = new Date(d.getTime() - (1000*60*60*24)); 
+0

यह डेलाइट बचत समय स्विच के दौरान गलत परिणाम देगा –

+0

वास्तव में, कैलेंडर गलत होगा। सवाल अतीत में 24 घंटे था, कल एक ही समय में नहीं। – user101884

+0

लगभग निश्चित रूप से सवाल स्वयं गलत था, यानी।ओपी ने इस विशेष मामले के बारे में नहीं सोचा - और यह इस बिंदु पर "पिछले दिन प्राप्त करें" शीर्षक के साथ असहमत है –

-4
int dayInMs = 1000 * 60 * 60 * 24; 
    Date previousDay = new Date(olddate.getTime() - dayInMs); 

समय/तिथि गणना के एक बहुत देखते हैं व्यक्तिगत रूप से अगर, मैं Joda-time साथ जाना चाहते हैं।

+0

में तारीखों की तारीख हमेशा खराब होती है, जो खराब कोड है, जो डेलाइट सेविंग टाइम स्विच पर 1 घंटे दूर होगा –

+0

जैसा कि आपने ऊपर दी गई टिप्पणियों में नोट किया है, नथनील शायद अनजान है अंतर, इसलिए उसे वास्तव में क्या मतलब है उसे फिर से करने की जरूरत है। –

+0

मैं देखता हूं ... मैंने शीर्षक ("पिछले दिन") के बजाय टेक्स्ट ("24 घंटे") के लिए अधिक वजन दिया। –

0

याद रखने की महत्वपूर्ण बात यह है कि तिथि वर्ग को समय पर किसी भी बिंदु का प्रतिनिधित्व करना चाहिए, जबकि कैलेंडर कक्षा का उपयोग समय पर उन बिंदुओं में हेरफेर करने के लिए किया जाता है। आखिरकार, SimpleDateFormat स्ट्रिंग्स के रूप में उनका प्रतिनिधित्व करेगा।

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

मुझे लगता है कि आप वास्तव में '24 घंटे पहले' नहीं ढूंढना चाहते हैं, लेकिन वास्तव में 'कल इस बार' का प्रतिनिधित्व करने वाला एक नया दिनांक उदाहरण चाहते हैं - किसी भी तरह से, आप दिनांक 24 घंटे के लिए कैलेंडर उदाहरण से पूछ सकते हैं पहले या 1 दिन पहले।

डेलाइट बचत एक महान उदाहरण है। 26 मार्च 200 9 को यूके 'स्पैंग फॉरवर्ड'। तो, 3.00a.m से 1 दिन पहले 26.Mar.2009 को 3.00a.m उत्पन्न करना चाहिए 25. मार्च 200 9 लेकिन 24 घंटे पहले 2.00 एएम मिलेगा।

public class DateTests extends TestCase { 
    private static String EXPECTED_SUMMER_TIME = "2009.Mar.29 03:00:00"; 
    private static String EXPECTED_SUMMER_TIME_LESS_DAY = "2009.Mar.28 03:00:00"; 
    private static String EXPECTED_SUMMER_TIME_LESS_24_HRS = "2009.Mar.28 02:00:00"; 
    private static String EXPECTED_SUMMER_TIME_LESS_FURTHER_24_HRS = "2009.Mar.27 02:00:00"; 

    public void testSubtractDayOr24Hours() { 

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MMM.dd HH:mm:SS"); 

    Calendar calendar = Calendar.getInstance(); 

    // Create our reference date, 3.00 a.m. on the day the clocks go forward (they 'went' forward at 02.00) 
    calendar.clear(); 
    calendar.set(2009, 2, 29, 3, 0); 

    Date summerTime = calendar.getTime(); // Sun Mar 29 03:00:00 BST 2009 
    String formattedSummerTime = formatter.format(summerTime); 
    calendar.add(Calendar.DAY_OF_MONTH, -1); 

    // Our reference date less 'a day' 
    Date summerTimeLessADay = calendar.getTime(); // Sat Mar 28 03:00:00 GMT 2009 
    String formattedSummerTimeLessADay = formatter.format(summerTimeLessADay); 

    // reset the calendar instance to the reference day 
    calendar.setTime(summerTime); 

    // Our reference date less '24 hours' (is not quite 24 hours) 
    calendar.add(Calendar.HOUR, -24); 
    Date summerTimeLess24Hrs = calendar.getTime(); // Sat Mar 28 02:00:00 GMT 2009 
    String formattedSummerTimeLess24Hrs = formatter.format(summerTimeLess24Hrs); 

    // Third date shows that taking a further 24 hours from yields expected result 
    calendar.add(Calendar.HOUR, -24); 
    Date summerTimeLessFurther24Hrs = calendar.getTime(); // Fri Mar 27 02:00:00 GMT 2009 
    String formattedSummerTimeLessFurther24Hrs = formatter.format(summerTimeLessFurther24Hrs); 

    // reset the calendar once more to the day before 
    calendar.setTime(summerTimeLess24Hrs); 

    // Take a 'day' from the Sat will yield the same result as date 03 because Daylight Saving is not a factor 
    calendar.add(Calendar.DAY_OF_MONTH, -1); 
    Date summerTimeLessFurtherDay = calendar.getTime(); // Fri Mar 27 02:00:00 GMT 2009 
    String formattedSummerTimeLessFurtherDay = formatter.format(summerTimeLessFurtherDay); 

    assert(formattedSummerTime.equals(EXPECTED_SUMMER_TIME)); 
    assert(formattedSummerTimeLessADay.equals(EXPECTED_SUMMER_TIME_LESS_DAY)); 
    assert(formattedSummerTimeLess24Hrs.equals(EXPECTED_SUMMER_TIME_LESS_24_HRS)); 

    assert(formattedSummerTimeLessFurther24Hrs.equals(EXPECTED_SUMMER_TIME_LESS_FURTHER_24_HRS)); 

    // This last test proves that taking 24 hors vs. A Day usually yields the same result 
    assert(formattedSummerTimeLessFurther24Hrs.equals(formattedSummerTimeLessFurtherDay)); 

    } 
} 

दिनांक कार्यों के परीक्षण के लिए, wwwdot-timeanddate-dot-com एक महान संसाधन है।

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