Отображение часов между двумя датами в Java

у меня есть этот код, мне нужно показать только часы: мин: сек, любая помощь?

String var = "1429174464829"; (this is time in System.currentTimeMillis() )
String p = "HH:mm:ss";
SimpleDateFormat f = new SimpleDateFormat(p);
long t = var - System.currentTimeMillis();
String result = f.format(new Date(t));

в примере String var на 1 час выше, чем проблема с результатом System.currentTimeMillis()

EDIT: я получаю: результат = 21:59:00

Спасибо


person Julian Albarracin Cruz    schedule 16.04.2015    source источник
comment
Итак, var — это продолжительность?   -  person MadProgrammer    schedule 16.04.2015
comment
этот пример позволит вам получить части времени как продолжительность между две даты, но вам нужно отформатировать их вручную   -  person MadProgrammer    schedule 16.04.2015
comment
var — пример будущей даты: var = System.currentTimeMillis() + 1 час в миллисекундах;   -  person Julian Albarracin Cruz    schedule 16.04.2015
comment
SimpleDateFormat действительно не подходит для форматирования длительности, что произойдет, если между ними будет 14 часов?   -  person MadProgrammer    schedule 16.04.2015
comment
я обновляю вопрос, мне нужно узнать, сколько времени между текущим временем и переменным   -  person Julian Albarracin Cruz    schedule 16.04.2015
comment
Используйте API времени Java 8 или JodaTime, если вы не можете использовать Java 8   -  person MadProgrammer    schedule 16.04.2015


Ответы (4)


Ява 8

Хорошо, это немного неприятно, но работа будет выполнена, это использует API времени Java 8.

LocalDateTime dt1 = LocalDateTime.ofInstant(Instant.ofEpochMilli(1429174464829L), ZoneId.systemDefault());
LocalDateTime dt2 = LocalDateTime.now().plusDays(1);

System.out.println(dt1);
System.out.println(dt2);
    
StringJoiner sj = new StringJoiner(":");
long hours = ChronoUnit.HOURS.between(dt1, dt2);
sj.add(Long.toString(hours));
dt2 = dt2.minusHours(hours);
long mins = ChronoUnit.MINUTES.between(dt1, dt2);
sj.add(Long.toString(mins));
dt2 = dt2.minusMinutes(mins);
long secs = ChronoUnit.SECONDS.between(dt1, dt2);
sj.add(Long.toString(secs));
    
System.out.println(sj);

И выведет что-то вроде...

2015-04-16T18:54:24.829
2015-04-17T14:10:54.281
19:16:29

Вот если бы я сделал что-то вроде...

LocalDateTime dt2 = LocalDateTime.now().plusDays(4);

Вместо этого я бы получил 91:21:10.

Я надеюсь, что у кого-то есть лучшее решение, потому что это своего рода беспорядок...

Джода-Время

Если вы не можете использовать Java 8, используйте Joda-Time

DateTime dt1 = new DateTime(1429174464829L);
DateTime dt2 = DateTime.now().plusDays(4);

System.out.println(dt1);
System.out.println(dt2);
Duration yourDuration = new Duration(dt1, dt2);
Period period = yourDuration.toPeriod();
PeriodFormatter hms = new PeriodFormatterBuilder()
                .printZeroAlways()
                .appendHours()
                .appendSeparator(":")
                .appendMinutes()
                .appendSeparator(":")
                .appendSeconds()
                .toFormatter();
String result = hms.print(period);
System.out.println(result);

Что выводит 91:26:33

person MadProgrammer    schedule 16.04.2015
comment
спасибо за ответ, но весь мой код использует java 7, для работы в java 8 мне нужно несколько дней для преобразования моего проекта. :( - person Julian Albarracin Cruz; 16.04.2015

Есть проблема с часовым поясом. мы должны указать часовой пояс с помощью SimpleDateFormat. Это дает результат после добавления разницы во времени вашего системного часового пояса со стандартным часовым поясом UTC. По умолчанию используется часовой пояс вашей локальной системы.

String var = "1429174464829"; (this is time in System.currentTimeMillis() )
String p = "HH:mm:ss";
SimpleDateFormat f = new SimpleDateFormat(p);
f.setTimeZone(TimeZone.getTimeZone("UTC"));

long t = long.parseLong(var) - System.currentTimeMillis();
String result = f.format(new Date(t));
person Lokesh Kumar    schedule 16.04.2015

Ну, по моему опыту, такого рода вещи вы не хотите кодировать самостоятельно. Где-то в будущем вы столкнетесь с пограничными случаями, такими как переход на летнее время, високосные годы и т. д. и т. д.

Если вы хотите делать такие вещи надежно, используйте библиотеку времени, такую ​​как JodaTime (мое предпочтение )

Например, Период может дать вам отдельные части и может быть создан из Продолжительность по телефону toPeriod().

person Daniel Langdon    schedule 16.04.2015
comment
Проблема, с которой я столкнулся, заключается в том, что единицы не разбиваются, например, если между датами 2 часа 30 минут, то getStandardHours возвращает 150 вместо 30... - person MadProgrammer; 16.04.2015
comment
Ну, раз библиотека заботится о хронологии и т. д., я думаю, вы всегда можете делить на 3600, 60, 24 и т. д. :-) - person Daniel Langdon; 16.04.2015
comment
позвольте мне дать вам фактический указатель на то, что вы хотите... дайте мне секунду, и я отредактирую. - person Daniel Langdon; 16.04.2015
comment
Или просто вычтите единицы, которые вам больше не интересны... кроме того, с Period и PeriodFormatter вам не нужно проходить беспорядок (я бы хотел, чтобы Java 8 могла это сделать) - person MadProgrammer; 16.04.2015

Я думаю, вы можете использовать Jodatime для получения часов, и это хорошая библиотека. Надеюсь, поможет. Ваше здоровье!

person Rod Fetalvero    schedule 16.04.2015