2016-09-10 1 views
1

Я пытаюсь создать простой будильник, но наткнулся на проблему, которую я не могу исправить. Я пытаюсь разобрать строку на дату, поэтому я могу получить разницу между текущим временем и временем, чтобы отключить будильник.date.getTime() короче System.getCurrentTimeMillis()

Вот мой код, чтобы разобрать время:

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

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

Вот мой getTimezone() метод:

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); 
} 

И вот мой код выяснить разницу:

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

Поэтому моя проблема заключается в том, что date.getTime() возвращает 79680000, а System.currentTimeMillis() возвращает 1473538047978 (This i с разным разным, но по какой-то нечетной причине date.getTime() не является).

Это означает, что я получаю отрицательное число при попытке выяснить разницу, и поэтому я не могу ее использовать.

EDIT: После небольшой отладки я понял, что это связано с тем, что год, месяц и день не установлены, однако я не знаю, как их получить.

+0

У меня нет проблем, большее число означает, что оно «более новое». Вы должны сделать проверку «<0» с результатом, а в случае отрицательного умножить ее на -1, чтобы повернуть ее. Однако, пожалуйста, объясните, что у вас проблемы более подробно. – Luftbaum

+0

@Luftbaum Какие детали вам нужны? Могу сказать, что время ввода 22:20:00 –

+0

С текущего дня? На самом деле, не могли бы вы сказать, чего вы хотите достичь в целом? – Luftbaum

ответ

3

Вы заметили, что Date.getTime() возвращает 79680000, которая составляет 22 часов и 20 минут после 1 января 1970. Проблема (как вы заметили), что вы не разбирали год, месяц и день.

Вы можете сделать это с помощью:

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

Пример входных данных 20/04/2016 20:20:0 возвращает время, как Mon Jan 04 20:20:00 CET 2016 (не смотрите на часовом поясе). Это составляет 1451935200000 милисекунд после 1 января 1970 года.

Примечание: измените строку в соответствии с вашими требованиями к формату (синтаксис не требует пояснений).

0

Обновлено. Вы используете только время без даты, когда вы указываете объект в коде (только для разбора). Если вы добавите туда дату, ваша дата должна быть сопоставима с вашим вызовом System.getCurrentTimeMillis(). И если вы вычитаете текущие миллисы с даты в прошлом, у вас будут отрицательные числа. Я предпочитаю эту Перекодировку (date2 после date1):

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); 

Но поскольку мы настраиваем будильник, мы также заботимся о дате.

ZonedDateTime now = ZonedDateTime.now(z); 
ZonedDateTime alarm = null; 
if (now.toLocalTime().isBefore(alarmTime)) { 
    alarm = ZonedDateTime.of(now.toLocalDate() , alarmTime , z); 
} else {. // Else too late for today, so set alarm for tomorrow. 
    alarm = ZonedDateTime.of(now.toLocalDate().plusDays(1) , alarmTime , z); 
} 

Чтобы вычислить прошедшее время до тревоги, используйте класс Duration.

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

Вы можете допросить продолжительность на общее количество миллисекунд. Но знайте, что классы java.time способны обрабатывать наносекунды.

long millis = untilAlarm.toMillis(); 
Смежные вопросы