При чтении вашего кода вы получаете строку publishedAt
, которая должна выглядеть как 2019-10-21T15:12:34+02
или 2019-10-21T13:01:23Z
. Если вы не можете разобрать его, ваш код пытается использовать вместо него дату и время, полученные из var d = Date()
, то есть текущее время.
java.time
Это можно сделать оченьлегко, когда знаешь как. Мне жаль, что я могу писать только код Java. Мне нужно доверять вам, чтобы перевести себя.
String publishedAt = "2019-10-21T13:01:23Z";
Instant timelinePoint;
try {
timelinePoint = DateTimeFormatter.ISO_OFFSET_DATE_TIME
.parse(publishedAt, Instant::from);
} catch (DateTimeParseException dtpe) {
timelinePoint = Instant.now();
}
Instant now = Instant.now();
Duration elapsedTime = Duration.between(timelinePoint, now);
System.out.println(timelinePoint);
System.out.println(now);
System.out.println(elapsedTime.toMinutes());
Когда я только что запустил этот фрагмент, я получил такой вывод:
2019-10-21T13:01:23Z
2019-10-21T16:17:49.719Z
196
DateTimeFormatter.ISO_OFFSET_DATE_TIME
будетразбирать вашу строку одинаково, независимо от того, задано ли смещение в виде часов и необязательных минут или в виде Z
для нуля. Таким образом, вышеприведенное относится к обоим вашим форматам.
Что пошло не так в вашем коде?
Нет никаких причин вводить SimpleDateFormat
и Date
в ваш код. Это только усложнит ситуацию, ничего не выиграв. Кроме того, эти классы плохо разработаны, первые, в частности, печально известны своими хлопотами, а также давно устарели, поэтому я настоятельно рекомендую вам отсеять их и никогда больше не трогать.
Класс
LocalDateTime
из java.time, которыйвы используете неправильный класс для точки на временной шкале. Если смещение в вашей строке отличается от смещения UTC для часового пояса JVM по умолчанию, вы получите
LocalDateTime
объектов с различными подразумеваемыми смещениями. Это означает, что не имеет смысла сравнивать их, и вы получите неверное истекшее время между ними.
За исключением того, что вы наблюдали: В случае, когда вы не могли разобрать вашу строку в любой попытке,Вы форматировали текущую дату и время (с Date()
) в формат dd/MM/yyyy
, например 21/10/2019
, а затем пытались проанализировать эту строку, используя одно аргумент LocalDateTime.parse()
. Есть несколько вещей не так с этим. Во-первых, метод parse
предполагает формат ISO 8601. Документация гласит:
Получает экземпляр LocalDateTime
из текстовой строки, такой как 2007-12-03T10:15:30
.
Вы видите, что форматы 21/10/2019
и 2007-12-03T10:15:30
не одинаковы. Это причина вашего исключения. Сообщение об исключении говорит at index 0
, потому что в индексе 0 в вашей строке есть двузначное число, а метод ожидает «четыре цифры или более в год» (цитируется из документации DateTimeFormatter.ISO_LOCAL_DATE
). Во-вторых, вы не хотите измерять прошедшее время в минутах на основе даты без времени суток. В-третьих, вы не можете разобрать строку даты без времени дня в LocalDateTime
(есть хитрости, но это не работает просто так).
Ссылки