В Java и других языках программирования момент времени иногда представляется в виде количества миллисекунд, начиная с так называемой эпохи от 1 января 1970 года в 00:00:00 UTC, исключая високосные секунды. Как говорится в комментарии, ваш метод берет такое число и преобразует его в начало дня (полночь) в UTC. Например, значение long
, представляющее 20 марта 2019 года в 09:22:43 UTC, будет преобразовано в значение, представляющее 20 марта 2019 года в 00:00:00 UTC. Если бы значение предназначалось только для представления даты, а не времени суток, с самого начала, я бы сказал, что описывать это как «нормализацию» имеет смысл.
Как это работает? date
, переменная long
, содержащая миллисекунды, сначала делится на количество миллисекунд в дне (я полагаю; я читаю DAY_IN_MILLIS
как « 1 день в миллисекундах »). Это дает число дней с начала эпохи. Остаток от подразделения отбрасывается; Вы получаете только целые дни. Затем при повторном умножении на DAY_IN_MILLIS
вы переводите обратно в миллисекунды. Поскольку эпоха была определена как 00:00:00 в этот день, вы получаете 00:00:00 UTC в тот же день, что и с начала. Это работает, поскольку UTC не имеет летнего времени (DST) и других временных аномалий (оно не будет работать в часовых поясах, которые имеют).
И я признаю, что бит «по местному времени» для меня тоже не имеет смысла. Я полагаю, что это никогда не имело никакого смысла.
Позвольте мне добавить, что это плохой код , хотя (даже если вы не спрашивали), что я также вижу в качестве причины, по которой вам нужно было спросить. Использование количества миллисекунд с начала эпохи, как правило, не рекомендуется, а преобразование в начало дня лучше выполнять через стандартный API. Представление момента времени в виде миллисекунды является низкоуровневым и недружественным для человека. Просматривая число, например 1553074048964, в своем отладчике или журнале, вы, как правило, понятия не имеете, верно это или нет. Вместо этого следует использовать Instant
, или для даты без времени дня, а LocalDate
. Instant
печатает как например 2019-03-20T09:28:54.729Z
. Время указано в UTC, но даже если вы находитесь в другом часовом поясе, нетрудно понять, правильно это или нет. Instant
и LocalDate
- это классы из java.time, современного Java-API даты и времени. Этот API также имеет методы для всех видов операций с датой и временем, включая преобразование в начало дня.
Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.