자바

2017-10-22 1 views
-1
에 두 번 사이의 시간 차이를 계산하는
String time1 = br.readLine(); 
    DateFormat sdf = new SimpleDateFormat("hh:mm:ss",Locale.ENGLISH); 
    Date d1 = sdf.parse(time1); 
    int n = Integer.parseInt(br.readLine()); 
    for(int i=0;i<n;i++) { 
     String time2 = br.readLine(); 
     Date d2 = sdf.parse(time2); 
     long diffMs = d1.getTime() - d2.getTime(); 
     System.out.println(diffMs/(1000*60*60)); 

는 입력 :자바

time1 = 23:05:38 
time2 = 12:36:07 

출력이 10해야하지만 22을주고있다.

+2

'hh'는 12 시간 형식이고, 'HH'는 24 시간 형식입니다. 나는 그것이 당신 문제라고 생각합니다. –

+1

[자바에서 두 날짜 간의 차이 지속 시간을 찾는 방법] (https://stackoverflow.com/questions/17940200/how-to-find-the-duration-of-difference-between-two- dates-in-java) –

+1

사이드 노트와 마찬가지로 LocalTime과 Duration을 사용하면 훨씬 쉬울 것입니다. – Deb

답변

1

먼저 계산은 서머 타임 (DST) 및 기타 예외가없는 시간대 또는 적어도 전환이없는 날짜에 수행된다고 가정합니다.

이미이 벌금을 취급하고있는 것으로 보아서 BufferedReader에서 읽지 않았습니다. modern Java date and timeAPI known as JSR-310 or java.time를 사용하여 :

String time1 = "23:05:38"; 
    LocalTime t1 = LocalTime.parse(time1); 
    String time2 = "12:36:07"; 
    LocalTime t2 = LocalTime.parse(time2); 
    Duration diff = Duration.between(t2, t1); 
    System.out.println(diff.toHours()); 

이 내가 the comment에 뎁의 제안에 따라하고, 10

당신이 볼 수 있듯이

예상

를 인쇄합니다. LocalTime은 명시적인 포맷터없이 24 시간 시계에서 시간을 구문 분석하므로 형식 패턴 문자열에서 잘못된 대/소문자를 사용할 기회가 없으므로 자동으로 문제가 해결됩니다.

그렇습니다. d.j.brown에 동의합니다. 소문자 인 hh이 귀하의 패턴입니다. 시간은 말도 안되는 23:05:38 AM으로 해석되었지만 구식 인 SimpleDateFormat은 그 시간이 오후 11:05:38, 즉 23시 5 분 38 초라는 것을 의미합니다. 예상했다. IMHO 당신에게 말하지 않고 그러한 버그를 없애 버리는 것은 아주 심술 궂습니다. 12시 36 분 07 초는 24시 시계에 0시 36 분 07 초를 의미하므로 이번에는 잘못된 결과를 얻었고 잘못된 것이 있음을 알게되었습니다. 그렇지 않으면 당신의 버그는 오랫동안 주목받지 못했을 것입니다. 사기를 전하는이 긴 이야기는 SimpleDateFormat에서 멀리 떨어져 있습니다.

질문 : 최신 API를 Java 버전과 함께 사용할 수 있습니까?

최소한 Java 을 사용하는 경우 가능합니다.

  • Java 8 이상에서는 새로운 API가 내장되어 있습니다.
  • Java 6 및 7에서는 the ThreeTen Backport을 얻습니다. 새 클래스의 백 포트 (최신 API가 처음 정의 된 JSR-310의 경우 ThreeTen입니다).
  • Android의 경우 ThreeTen Backport의 Android 버전을 사용하십시오. ThreeTenABP라고 불리우며, this question: How to use ThreeTenABP in Android Project에 훌륭한 설명이 있다고 생각합니다.