2012-07-31 58 views
0

我已經下面代碼在Java中1.7:日期/時間轉換/算術

DateFormat df = DateFormat.getInstance(); 
Date startDate = df.parse("07/28/12 01:00 AM, PST"); 

上述日期時間(12年7月28日上午01點00,PST)是在屬性文件,該文件是可配置的。如果這個日期時間已經過去了,然後我需要獲得當前日期,設置時間部分來自上面的字符串是上午01:00 PST在當前日期&如果這時候也已經過去了,再拿到第二天&從上面的字符串中設置時間部分。最後的對象應該是Date,因爲我需要在Timer對象中使用它。

我怎麼能這樣做有效地?我應該從日期轉換爲日曆嗎?反之亦然?任何人都可以提供摘錄嗎?

+2

雖然你可以使用日曆和它的工作,我會每SONAL建議喬達時間http://joda-time.sourceforge.net/它只是需要很多的煩惱了不得不處理Java日期的和時間 - 恕我直言 – MadProgrammer 2012-07-31 01:17:59

+0

我還建議HTTP://joda-time.sourceforge。網/易於使用,並提供了豐富的Java日期和日曆功能 – exexzian 2012-07-31 01:26:15

+0

由於我們的政策,我無法使用joda :((請看我的評論如下。欣賞任何其他替代品... – Mike 2012-07-31 01:27:53

回答

0

我認爲這應該工作...你algorthim有我的頭紡紗一點,我在不同的時區,所以你原始字符串沒」將不起作用:P

try { 

     DateFormat df = DateFormat.getInstance(); 
     Date startDate = df.parse("28/07/2012 01:00 AM"); 

     System.out.println("StartDate = " + startDate); 

     Date callDate = startDate; 

     Calendar today = Calendar.getInstance(); 
     Calendar start = Calendar.getInstance(); 
     start.setTime(startDate); 

     System.out.println("Today = " + today.getTime()); 

     // If this date time is already passed 
     // Tue Jul 31 12:18:09 EST 2012 is after Sat Jul 28 01:00:00 EST 2012 
     if (today.after(start)) { 

      //then I need to get the current date, set the time part from above string in the current date 
      Calendar timeMatch = Calendar.getInstance(); 
      timeMatch.setTime(startDate); 
      timeMatch.set(Calendar.DATE, today.get(Calendar.DATE)); 
      timeMatch.set(Calendar.MONTH, today.get(Calendar.MONTH)); 
      timeMatch.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

      //& if this time is also already passed, then get the next day & set the time part from above string in it 
      if (timeMatch.after(today)) { 

       timeMatch.add(Calendar.DATE, 1); 

      } 

      callDate = timeMatch.getTime(); 

     } 

     System.out.println("CallDate = " + callDate); 

    } catch (ParseException exp) { 

     exp.printStackTrace(); 

    } 

這將產生以下輸出

StartDate = Sat Jul 28 01:00:00 EST 2012 
Today = Tue Jul 31 12:18:09 EST 2012 
CallDate = Tue Jul 31 01:00:00 EST 2012 
2

你應該看看Calendar類。您可以使用結構,如:

Calendar cal = Calendar.getInstance(); 
    cal.setTime(startDate); 
    cal.add(Calendar.DAY_OF_YEAR, 1); 

它也有檢查方法,如果您startDatebefore()after()新的日期(使用當前時間)。

在編寫內置的Java日期/時間結構時,如果我沒有插入Joda Time,我認爲是失職,被許多人認爲優於本地Java實現。

編輯:

這將是更有效的,以顯示Date.compareTo()處理的一個例子,作爲Calendar.before()Calendar.after()需要對其他Calendar對象,其可以是創建昂貴比較。

看看下面的例子:

DateFormat df = DateFormat.getInstance(); 
    Date startDate = df.parse("07/28/12 01:00 AM, PST"); 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(startDate); 
    Date now = new Date(); 
    if (startDate.compareTo(now)< 0) { 
     System.out.println("start date: " + startDate + " is before " + now); 

     Calendar nowCal = Calendar.getInstance(); 
     nowCal.add(Calendar.DAY_OF_YEAR,1); 
     cal.set(Calendar.DAY_OF_YEAR, nowCal.get(Calendar.DAY_OF_YEAR)); 

    } else if (startDate.compareTo(now) == 0) { 
     System.out.println("startDate: " +startDate + " is equal to " + now); 
    } else { 
     System.out.println("startDate: " + cal + " is after " + now); 

    } 
    System.out.println(cal.getTime()); 
+0

如何進行比較?只有當startDate已經通過時,我需要添加1天。根據我們的政策,我無法使用任何其他開源代碼,例如Joda((並且我不能簡單地使用cal.add(Calendar.DAY_OF_YEAR,1);因爲如果startDate很老,我必須繼續添加1天直到它通過當前日期這就是爲什麼我想知道是否有辦法從日期對象只提取時間部分,然後應用它當前日期? – Mike 2012-07-31 01:22:53

+0

嗨,我不能盲目添加1日,因爲我需要維護時間戳。因此,如果屬性文件的時間爲「01:00 AM,PST」,那麼它應該同時設置爲第二天。 – Mike 2012-07-31 01:48:56

+0

我已經更新了代碼 - 現在使用蠻力方法創建第二個日曆你需要增加的情況。 – akf 2012-07-31 01:59:56