currentTimeMillis vs Calendar

Я создавал приложение и, чтобы сохранить важную информацию о времени, я использовал System.currentTimeMillis() для получения меток времени в мс. Все мои алгоритмы используют эти данные ms, а даты сохраняются с этими данными ms. Также определяется продолжительность кеширования, и даты объектов форматируются из этой отметки времени в миллисекундах.

Я не уверен, что это хорошая практика. Лучше использовать Calendar.getinstace()

Я понял, что currentTimeMillis () может быть плохой практикой, поскольку это может привести к несоответствиям во временных данных, но я не понимаю, почему это так.


person chrisdottel    schedule 23.07.2020    source источник
comment
или, возможно, подумайте об использовании формата времени UNIX, это поможет в тех случаях, когда вам также нужно обрабатывать международные часовые пояса   -  person Samarth Gupta    schedule 23.07.2020
comment
Вы конвертируете миллисекунду в дату и время? Вы знаете о гораздо более новых java.time библиотеках?   -  person stdunbar    schedule 23.07.2020
comment
Calendar и его подкласс GregorianCalendar инициализируются значением System.currentTimeMillis(), если ему не предоставлена ​​явная метка времени. Следовательно, от этого особо нечего выиграть. Отметки времени в виде длинных значений подойдут, если вам нужно только проверить, какое событие произошло первым; используйте Календарь, когда вам нужно сделать что-то, основанное на человеческом календаре, например, форматирование даты или определение месяца, в котором была метка времени   -  person Roland Kreuzer    schedule 23.07.2020
comment
Возможные несоответствия со значением, о котором вы иногда слышите, заключаются в том, что оно основано на системных часах. Если пользователь изменит часы устройства на 2010 год, вы получите отметки времени этого года. Но этого вряд ли можно избежать в стандартном JDK. Если фактические деньги зависят от правильности метки времени, вы можете периодически проверять внешний сервер времени, чтобы убедиться, что системное время в порядке.   -  person Roland Kreuzer    schedule 23.07.2020
comment
Вы имели в виду несогласованное время, прошедшее в java? Никакой выбор библиотечных методов не спасет вас от этого. Кстати, я рекомендую Instant.now() для большинства целей.   -  person Ole V.V.    schedule 23.07.2020
comment
Отвечает ли это на ваш вопрос? System.currentTimeMillis () против новой даты () против календаря .getInstance (). getTime (). Пожалуйста, поищите больше, а когда закончите, сообщите, что точнее вы еще не нашли.   -  person Ole V.V.    schedule 23.07.2020


Ответы (1)


Календарь - всегда плохая практика.

В Java есть от 3 до 4 API на время. В порядке введения:

  • System.currentTimeMillis ()
  • (вместе с указанным выше): java.util.Date, а когда-нибудь позже, java.sql.Timestamp и Дата. Это очень плохой API; на данный момент почти все методы в них устарели, потому что они вводят в заблуждение или прямо не делают то, что они предполагают, и в любом случае являются гигантскими неправильными названиями. j.u.Date представляет собой момент времени, который трудно представить в человеческих терминах. Финики - это по сути человеческие понятия.
  • Календарь. Попытка исправить проблему. На самом деле это еще хуже: API вводит в заблуждение и удивляет (.set (MONTH, 1) установит месяц на .. Februari!) И полностью неидиоматичен, используя .set / .get с дополнительным параметром с ' field 'и имеющий изменяемые типы). Фактическая репрезентативная сила этого API все еще ограничена.
  • JSR310, он же java.time. ЭТО - хороший вариант. В этом есть несколько сюрпризов, это сложно, когда время оказывается на самом деле сложным, типы имеют правильные имена, вплоть до наличия как j.t.Instant, так и j.t.ZonedDateTime, и вы можете выразить практически все, что связано с датой.

Я бы сказал, что использование j.u.Date или Calendar настоятельно не рекомендуется. Если все, что вы делаете, это измеряете моменты времени, не стесняйтесь придерживаться System.currentTimeMillis (), но если вам когда-нибудь понадобится распечатать это в человеческой форме (например: 20.07.2020 в 16:34, это произошло), переключитесь на java.time. Если хотите, можете отказаться от currentTimeMillis и использовать для этих целей j.t.Instant - ваше предпочтение.

person rzwitserloot    schedule 23.07.2020
comment
Большое спасибо за разъяснения :) - person chrisdottel; 23.07.2020