API даты и времени java.util
и их API форматирования SimpleDateFormat
устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и перейти на современный API даты и времени.
Узнайте о современном API даты и времени из Trail: Date Time а>сильный>.
LocalDate
по умолчанию использует часовой пояс JVM
Всякий раз, когда задействован часовой пояс, обязательно укажите его при создании экземпляра LocalDate
. LocalDate
использует часовой пояс JVM по умолчанию, и вы никогда не должны сравнивать LocalDate
из одного часового пояса с другим без преобразования их обоих в один и тот же часовой пояс (рекомендуется UTC
). То же самое и в случае с LocalDateTime
. Вместо использования LocalDate
вы должны выполнять всю обработку с объектами, у которых есть и дата, и время (например, LocalDateTime
), и при необходимости вы можете получить из них LocalDate
.
Кроме того, объект java.util.Date
просто представляет количество миллисекунд со стандартного базового времени, известного как эпоха, а именно January 1, 1970, 00:00:00 GMT
(или UTC). Когда вы печатаете объект java.util.Date
, его метод toString
возвращает дату и время в часовом поясе JVM, вычисленные из этого значения в миллисекундах.
Следовательно, если вы получаете expiryDate
из объекта java.util.Date
, это по сути дата-время в UTC
.
Вы можете преобразовать now-in-PST и expiryDate
в java.time.Instant
и сравните их. java.time.Instant
— это мгновенная точка на временной шкале UTC.
Демонстрация с использованием современного API даты и времени:
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
public class Main {
public static void main(String[] args) {
LocalDateTime nowInPST = LocalDateTime.now(ZoneId.of("America/Los_Angeles"));
System.out.println(nowInPST);
// Convert it to date in UTC
Instant nowInPSTConvertedToInstant = nowInPST.atZone(ZoneId.of("America/Los_Angeles"))
.withZoneSameInstant(ZoneId.of("Etc/UTC"))
.toInstant();
// Some java.util.Date
Calendar calendar = Calendar.getInstance();
calendar.set(2020, 0, 10, 10, 10, 10);
Date date = calendar.getTime();
Instant expiry = date.toInstant();
System.out.println(nowInPSTConvertedToInstant.isBefore(expiry));
}
}
Вывод:
2021-01-17T10:58:38.490041
false
Примечание. Ознакомьтесь со следующим уведомлением на главной странице Joda-Time а>
Joda-Time — это де-факто стандартная библиотека даты и времени для Java до Java SE 8. Теперь пользователям предлагается перейти на java.time (JSR-310).
Упростите свое выражение
Следующее утверждение
boolean notExpired = expiryDate.isEqual(now) || expiryDate.isAfter(now);
можно упростить как
boolean notExpired = !expiryDate.isBefore(now);
person
Arvind Kumar Avinash
schedule
17.01.2021