Очень часто я сталкиваюсь с отрицательными отзывами о Java Date
и других классах, связанных с датой и временем. Как .NET-разработчик, я не могу полностью (без их использования) понять, что с ними на самом деле не так.
Кто-нибудь может пролить свет на это?
Ответы:
Ах,
Date
класс Java . Пожалуй, один из лучших примеров того, как что-то не делать на любом языке и нигде. С чего бы мне начать?Читая JavaDoc, можно подумать, что у разработчиков действительно есть несколько хороших идей. Подробно говорится о разнице между UTC и GMT , несмотря на то, что разница между ними в основном составляет високосные секунды (что случается довольно редко ).
Однако дизайнерские решения действительно сводят на нет любую мысль о том, чтобы быть хорошо разработанным API. Вот некоторые из любимых ошибок:
null
. В результате имеем 0..11 (а сегодня 11 месяц 109 года). В месяцах используется аналогичное количество ++ и - для преобразования в строку.Calendar
, чтобы «исправить» это, на самом деле совершает те же ошибки. Они все еще изменчивы.Date
представляет собойDateTime
, но для того, чтобы отложить это до тех, кто работает в области SQL, существует другой подклассjava.sql.Date
, который представляет один день (хотя и без связанного с ним часового пояса).TimeZone
s, связанных с aDate
, поэтому диапазоны (например, `` целый день '') часто представлены как полночь-полночь (часто в некотором произвольном часовом поясе)Наконец, стоит отметить, что дополнительные секунды обычно корректируются относительно хороших системных часов, которые обновляются с помощью ntp в течение часа (см. Ссылки ниже). Вероятность того, что система все еще будет запущена и будет работать после введения двух дополнительных секунд (минимум каждые шесть месяцев, практически каждые несколько лет), весьма маловероятна, особенно с учетом того факта, что вам придется время от времени повторно развертывать новые версии вашего кода. . Даже использование динамического языка, который регенерирует классы или что-то вроде механизма WAR, приведет к загрязнению пространства классов и в конечном итоге исчерпает permgen.
источник
JSR 310 , который заменил старые классы даты и времени на java.time в Java 8, оправдывает себя в исходной JSR следующим образом:
источник
getMonth()
отсчитывается от нуля,getYear()
отсчитывается от 1900 (т. Е. 2009 год представлен как 109).Date
класса.источник
Я сочувствую вам ... как бывший .NET-программист, я задавал те же вопросы, API времени в .NET (временные интервалы, перегрузка операторов) очень удобен.
Во-первых, чтобы создать конкретную дату, вы используете либо устаревший API, либо:
Чтобы вычесть день, вы делаете злые вещи, например
или хуже
Чтобы узнать, сколько времени прошло между двумя датами (в днях / неделях / месяцах) ... становится еще хуже
Однако DateUtils из apache (
org.apache.commons.lang.time.DateUtils
) предлагает несколько удобных методов, и в последнее время я использовал только их.Как писал Брабстер, Joda Time также является хорошей внешней библиотекой, но apache кажется более "распространенным", чем что-либо еще ...
источник
Period
иDuration
классы для расчета и представления истекшее время по шкале лет-месяцев дни и часы-минуты-секунды соответственно.Честно говоря, я считаю, что Java Date API можно использовать. Большинство вопросов , которые я видел и слышал о связанно с многословием, необходимость вовлечения нескольких классов , чтобы сделать что - нибудь полезное (
Calendar
,Date
,DateFormat
/SimpleDateFormat
) и отсутствие простых аксессоров какgetDayOfWeek()
.Joda Time - это хорошо зарекомендовавший себя альтернативный API на Java, и в разделе «Почему Joda Time» приводится еще несколько аргументов в пользу того, почему это жизнеспособная альтернатива, которая может представлять интерес.
источник