2013-09-25 2 views
0

Я создаю таймер обратного отсчета, у меня есть 2 даты (сейчас и дата окончания) в формате mm: dd: yyyy: hour: minute: sec, и мне нужно показать, сколько времени осталось, эффективно, что является
даты окончания: время - текущая дата: времяКак создать таймер даты

Я думал о преобразовании обе даты в миллисекундах, вычитая и затем преобразовать их обратно к датам, но это, кажется, слишком много хлопот Как реализовать это эффективно Ява?

+0

Ну. По сути, 'java.util.Date' - это немного больше, чем обертка вокруг длинной, которая представляет миллисекунды. Возможно, что-то из Joda Time может вас заинтересовать. – SJuan76

+0

Что-то вроде [PrettyTime] (http://ocpsoft.org/prettytime/) может помочь – MadProgrammer

ответ

1

Пусть joda-time рамки сделать это для вас

String date = "02:13:2013:14:45:42"; // one of these is your end time 
String date2 = "02:13:2013:14:45:49"; // the other gets smaller every time as you approach the end time 
// 7 seconds difference 

DateTimeFormatter format = DateTimeFormat.forPattern("MM:dd:yyyy:HH:mm:ss"); // your pattern 

DateTime dateTime = format.parseDateTime(date); 
System.out.println(dateTime); 

DateTime dateTime2 = format.parseDateTime(date2); 
System.out.println(dateTime2); 

Duration duration = new Duration(dateTime, dateTime2); 
System.out.println(duration.getMillis()); 

гравюр

2013-02-13T14:45:42.000-05:00 
2013-02-13T14:45:49.000-05:00 
7000 

Таким образом, вы разбором ваши даты Строки в DateTime объекты и использовать Duration объект для вычисления разницы во времени в какой-то единицу времени ,

Вы можете альтернативно использовать Interval или Period объекта (в зависимости от требуемой точности)

System.out.println(duration.toPeriod().get(DurationFieldType.seconds())); 

Вы утверждаете

Я думал о преобразовании обе даты в миллисекундах, вычитанием и затем преобразование их обратно в даты

Зачем вам нужно их преобразовать? У вас их уже есть. Тебе просто интересно время.

+0

Я преобразовываю их обратно в даты, потому что в моем приложении я хочу отображать оставшееся время в формате даты –

+0

@AkshatAgarwal Обратите внимание, что продолжительность не является датой, поэтому нет смысла отображать ее в формате 'hour: minute: seconds ... ', который вы делаете с датами. Объекты 'Period' имеют метод' get', который вы можете использовать с любой единицей времени. Например, вы можете показать часы, минуты и секунды. –

+0

@SotiriosDelimanolis Действительно, имеет смысл отображать результат в формате h: m: s, например, если у вас есть таймер обратного отсчета. Но вы правы, OP должен использовать методы getter для Duration для построения вывода String;) – MadProgrammer

0

Календарь до = Calendar.getInstance();

до .set ("ГГГГ", "ДД", "ЧЧ", "ММ", "СС");

getTimeDifference (до);


private String getTimeDifference(Calendar until) { 
    Calendar nowCal = (Calendar) until.clone(); 
    nowCal.clear(); 
    Date nowDate = new Date(System.currentTimeMillis()); 
    nowCal.setTime(nowDate); 
    int sec = until.get(Calendar.SECOND) - nowCal.get(Calendar.SECOND); 
    int min = until.get(Calendar.MINUTE) - nowCal.get(Calendar.MINUTE); 
    int hrs = until.get(Calendar.HOUR) - nowCal.get(Calendar.HOUR); 

    String timeDiff = hrs+":"+min+":"+sec; 

    return timeDiff; 
} 
+0

Разница даты и времени - сложный процесс, который должен учитывать ряд переменных факторов (не включая летнее время;)), тем более, что две даты отделены друг от друга, тем хуже проблема. Вычитание миллисекунд друг от друга не приведет к высокоточному результату.Лучше использовать выделенную библиотеку, такую ​​как JodaTime-IMHO – MadProgrammer

Смежные вопросы