2016-09-10 2 views
1

간단한 알람 시계를 만들려고하는데 수정하지 못하는 문제가 발생했습니다. 내가 현재 시간과 알람을 설정하는 시간 사이의 차이를 얻을 수 있도록 날짜 문자열을 구문 분석하려고 해요.date.getTime()이 System.getCurrentTimeMillis()보다 짧습니다.

여기 시간 구문 분석을 내 코드입니다 :

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); 
sdf.setTimeZone(getTimezone()); 

Date date = sdf.parse(args[0]); 

가 여기 내 된 getTimezone의을() 메소드 :

long diff = date.getTime() - System.currentTimeMillis(); 

:

public static TimeZone getTimezone() { 
    Calendar cal = Calendar.getInstance(); 
    long milliDiff = cal.get(Calendar.ZONE_OFFSET); 

    String [] ids = TimeZone.getAvailableIDs(); 
    String name = null; 
    for (String id : ids) { 
     TimeZone tz = TimeZone.getTimeZone(id); 
     if (tz.getRawOffset() == milliDiff) { 
     // Found a match. 
     name = id; 
     break; 
     } 
    } 
    return TimeZone.getTimeZone(name); 
} 

그리고 여기에 그 차이를 알아내는 내 코드입니다 그래서 내 문제는 System.currentTimeMillis()가 1473538047978을 반환하는 동안 date.getTime()이 79680000을 반환한다는 것입니다. This i 물론 매회마다 다르지만, 이상한 이유로 date.getTime()은 그렇지 않습니다.

즉, 차이를 알아 내려고 할 때 음수가 나오므로 사용할 수 없습니다.

EDIT : 약간의 디버깅 후, 나는 연, 월, 일이 설정되지 않은 것과 관련이 있다는 것을 깨달았지만, 어떻게해야할지 모르겠다.

+0

문제가 발생하지 않는다면 높은 숫자는 "새로운"것을 의미합니다. 결과와 함께 "<0"확인을 수행해야하며, 음수 인 경우에는 -1로 곱하면됩니다. 그러나보다 자세한 방법으로 문제를 설명하십시오. – Luftbaum

+0

@Luftbaum 어떤 세부 사항이 필요합니까? 입력 시간은 22:20:00라고 말할 수 있습니다. –

+0

오늘의? 사실, 당신이 말할 수 있겠습니까? 당신이 일반적으로 원하는 것은 무엇입니까? – Luftbaum

답변

3

당신은 date.getTime() 22시간 및 1970년 1월 1일 후 20 분하는 79,680,000를 반환 통지를했다. 문제는 (당신이 주목 한 것처럼) 당신이 년, 월, 일을 분석하지 않았다는 것입니다.

당신은 그것으로 수행 할 수 있습니다

SimpleDateFormat sdf = new SimpleDateFormat("DD/MM/YYYY hh:mm:ss"); 

예 입력 20/04/2016 20:20:0 반환 시간을 Mon Jan 04 20:20:00 CET 2016이 (시간대에 보이지 않는)로.

참고 : 형식 요구 사항에 맞게 문자열을 변경하십시오 (구문 자체는 설명이 필요함).

0

업데이트 됨. 코드 개체가 날짜와 함께 시간 만 사용하고 있습니다 (시간 만 구문 분석). 거기에 날짜를 추가하면 날짜가 System.getCurrentTimeMillis() 호출과 비슷해야합니다. 그리고 과거 날짜에서 현재 밀리를 빼면 음수가됩니다. 나는 (DATE2가 DATE1 이후)이 convertion을 선호 :

long diffInMillies = date2.getTime() - date1.getTime(); 
return TimeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS); 
1

accepted answer by Ronin이 정확합니다. 시간 값을 날짜/시간 유형에 넣으려고합니다.

java.time

또한,이 귀찮은 오래된 기존의 날짜 - 시간 클래스를 사용하고 있습니다. java.time 클래스를 대신했습니다.

날짜가없고 시간대가없는 시간대 값의 경우 LocalTime을 사용하십시오.

LocalTime alarmTime = LocalTime.parse("12:34"); 

현재 시간대를 얻는 데 시간대가 필요합니다.

ZoneId z = ZoneId.of("America/Montreal"); 
LocalTime now = LocalTime.now(z); 

하지만 알람을 설정하고 있기 때문에 날짜도 중요합니다.

경보까지의 경과 시간을 계산하려면 Duration 클래스를 사용하십시오.

Duration untilAlarm = Duration.between(now , alarm); 

총 시간 (밀리 초)을 조사 할 수 있습니다. 그러나 java.time 클래스는 나노초를 처리 할 수 ​​있습니다.

long millis = untilAlarm.toMillis(); 
관련 문제