2012-04-10 41 views
3

首先原諒我的英語:-(比較小時

我有一個關於java小時的一個問題讓我們來看看它的一個例子:

DateFormat datos = new SimpleDateFormat ("hh:mm:ss"); 
     Date ac, lim; 
     String actual,limit; 
     actual="18:01:23"; 
     limit="00:16:23"; 

     ac=datos.parse(actual); 
     lim=datos.parse(limit); 


     if(ac.compareTo(lim)==-1){....... 

我需要解決這種情況下,我的程序說實際已經達到極限,並且它不正確,因爲在這個例子中,它仍然有6個小時完成。

我試圖用DateFormat來解決它但它並沒有看到這種情況,我也用Time類嘗試過它,但它的方法ds已棄用。

我該如何解決這個問題?

+0

如果不指定日期,這是正常的,實際的被認爲是限制後...實現你想要的唯一方法是指定該限制是實際後一天(默認情況下,日期會認爲它是同一天) – Vinze 2012-04-10 09:23:24

+0

好的....所以我會改變它並使用Date類。在計算時間限制時,如果它將小時數23傳遞給0,我將添加1天。所以這將是正確的。謝謝 – user1297810 2012-04-10 11:46:11

回答

12

使用HH而不是hhSimpleDateFormat

DateFormat datos = new SimpleDateFormat("HH:mm:ss"); 

hh是12小時制(小時去從1到12)。

HH是24小時制時鐘(小時從0到23)。

但除此之外,還有其他的事情是錯的。 Date類不適合只包含一個時間。如果你這樣做,它將被解析爲01-01-1970與指定的時間。所以18:01:23變成01-01-1970,18:01:23和00:16:23變成01-01-1970,00:16:23。你可能想在第二天比較18:01:23到00:16:23。

嘗試是這樣的:

String actual = "18:01:23"; 
String limit = "00:16:23"; 

String[] parts = actual.split(":"); 
Calendar cal1 = Calendar.getInstance(); 
cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0])); 
cal1.set(Calendar.MINUTE, Integer.parseInt(parts[1])); 
cal1.set(Calendar.SECOND, Integer.parseInt(parts[2])); 

parts = limit.split(":"); 
Calendar cal2 = Calendar.getInstance(); 
cal2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parts[0])); 
cal2.set(Calendar.MINUTE, Integer.parseInt(parts[1])); 
cal2.set(Calendar.SECOND, Integer.parseInt(parts[2])); 

// Add 1 day because you mean 00:16:23 the next day 
cal2.add(Calendar.DATE, 1); 

if (cal1.before(cal2)) { 
    System.out.println("Not yet at the limit"); 
} 

圖書館Joda Time是一種流行的Java日期和好得多設計比標準的Java日期和日曆API時庫;如果您必須使用Java中的日期和時間,請考慮使用它。

有了約達時間,你可以這樣做:

String actual = "18:01:23"; 
String limit = "00:16:23"; 

DateTimeFormatter df = DateTimeFormat.forPattern("HH:mm:ss"); 

DateTime ac = df.parseLocalTime(actual).toDateTimeToday(); 
DateTime lim = df.parseLocalTime(limit).toDateTimeToday().plusDays(1); 

if (ac.isBefore(lim)) { 
    System.out.println("Not yet at the limit"); 
} 
0

作爲一個快速和骯髒的解決方案:

final DateFormat datos = new SimpleDateFormat("HH:mm:ss"); 
    Date ac; 
    final Date lim = new Date(); 
    String actual, limit; 
    actual = "18:01:23"; 
    limit = "00:16:23"; 

    try { 
     ac = datos.parse(actual); 
     lim.setTime(ac.getTime() + TimeUnit.MINUTES.toMillis(16) + TimeUnit.SECONDS.toMillis(23)); 
     if (ac.before(lim)) { 
      // TODO 
     } 
    } catch (final ParseException e) { 
     e.printStackTrace(); 
    }