Доброго времени суток. Есть файл, от которого мне нужно узнать, насколько давно он был создан. Вот код:
long dm = mFile.lastModified(), t = System.currentTimeMillis();
// dm = 1499499652963
// t = 1499504988843
System.out.println(new SimpleDateFormat("HH:mm").format(new Date(dm))); //выводит 10:40
System.out.println(new SimpleDateFormat("HH:mm").format(new Date(t))); //выводит 12:09
System.out.println(new SimpleDateFormat("HH:mm").format(new Date(t - dm))); //выводит 04:28 - Ошибка
Последняя строка кода должна вывести время, сколько часов и минут назад был создан файл. То есть, это должно быть 12:09 - 10:40 = 01:29. Но никак не 04:28. Пробовал высчитать разницу немного по-другому:
System.out.println(new SimpleDateFormat("HH:mm").format(new Date(t).getTime() - new Date(dm).getTime()));
Результат не изменился. В чём ошибка? Может я что-то не так высчитываю или это баг JDK? Подскажите, как получить корректный результат в данном случае.
Какой результат возвращает t-dm, какой размерности?
Ответ - миллисекунды. А именно, миллисекунды, прошедшие со "старта эпохи", 1 января 1970.
Соответственно, 12:09 - 10:40 дают вам количество миллисекунд, которое при отсчёте от 00:00:00 преобразуется в 04:28.
Соответственно, если вам нужно найти разницу во времени, используйте следующий подход:
Date startDate = someDate;
Date endDate = anotherDate;
long duration = endDate.getTime() - startDate.getTime();
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
Затем, выводите эти значения через нужные форматтеры.
Здесь нет никакой ошибки. То что вы написали, вычисляет разницу, и затем, конвертируется в дату, а она в свою очередь получается прибавлением этого значения к полночи 1 января 1970 года по UTC (так называем unix timestamp).
Чтобы получить желаемое значение, можно явно получить из разницы часы и минуты. Например, так:
System.out.println(String.format("%s:%s",
TimeUnit.MILLISECONDS.toHours(now - lastModificationTime) % 24,
TimeUnit.MILLISECONDS.toMinutes(now - lastModificationTime) % 60));
1:28
Сборка персонального компьютера от Artline: умный выбор для современных пользователей