Что лучший способ состоит в том, чтобы управлять Датами и Метками времени в Java?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

15
задан JodaStephen 16 August 2013 в 18:03
поделиться

9 ответов

Это сообщение имеет хорошее обсуждение сравнения Даты/Времени Java API по сравнению с JODA.

я лично просто использую Григорианский календарь и SimpleDateFormat любое время, я должен управлять датами/временами в Java. Я действительно никогда не имел никаких проблем в использовании Java API и нахожу это довольно простым в использовании, поэтому действительно не изучили альтернатив.

10
ответ дан 1 December 2019 в 02:56
поделиться

Проект Lang палаты общин Apache имеет DateUtils класс, который выполняет полезные операции Даты.

я использую DateUtils.truncate() много, который "обнулит" части Даты Вас (полезный, если Вы захотите свой объект Даты, скажем, представить дату и не включать информацию времени). Каждый метод работает и на Date и на Calendar объекты также.

http://commons.apache.org/lang/

3
ответ дан 1 December 2019 в 02:56
поделиться

Использование Im GregorianCalendar - всегда и везде. Простой java.util. Дата слишком сложна, да.

Так, мой совет - используют GC, его простое

1
ответ дан 1 December 2019 в 02:56
поделиться

Я использовал Joda исключительно в течение трех лет теперь и определенно рекомендовал бы это - этому покрыли целую область интерфейсом, который 'делает то, что это говорит'.

Joda может выглядеть сложным, когда Вы запускаете, как, например, он имеет понятия периодов, продолжительности и интервалов, которые смотрят вид подобных, но можно начаться просто, заняв место org.joda.time.DateTime (или org.joda.time.DateMidnight) для java.util.Date в коде и придерживаясь многих полезных методов, которые те классы содержат, прежде, чем понять другие области.

2
ответ дан 1 December 2019 в 02:56
поделиться

Это - то же в JavaScript. Кто-то, должно быть, курил что-то, когда они думают, что это - хорошая идея позволить 2008 означать 2008 год, 31 означать 31-й день в месяце, и - это - большая часть - 11 для значения 12-го месяца.

, С другой стороны, они разобрались в нем на два из три.

1
ответ дан 1 December 2019 в 02:56
поделиться

Вещью, которая всегда получает меня с Java, является библиотека времени даты. Я никогда не использовал Joda, лишь кратко посмотрите на него, похож, это - довольно хорошая реализация, и если я понимаю JSR-130 правильно его знание взятия от Joda и в конечном счете включая его в JavaSE.

Довольно часто для прошлых проектов я перенес объекты времени даты Java, который сам по себе был настоящей задачей. Затем используемый обертки для управления датой.

1
ответ дан 1 December 2019 в 02:56
поделиться

Много программистов начинает при помощи Даты, которая имеет многочисленных перегруженных конструкторов устаревших (мешающий использовать), но после того как Вы выясняете GregorianCalendar, которым становится немного легче управлять. Пример здесь довольно полезен:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html

0
ответ дан 1 December 2019 в 02:56
поделиться

API даты очень трудно разработать, особенно если они должны иметь дело с локализацией. Попробуйте к самокрутке и посмотрите, это стоит сделать, по крайней мере, однажды. То, что Joda смог сделать такое хорошее задание, является реальным кредитом своим разработчикам. Для ответа на вопрос я услышал только хорошее о той библиотеке, хотя я никогда не играл вокруг с ним сам.

0
ответ дан 1 December 2019 в 02:56
поделиться

Действительно просто записать Вашей собственной дате API, который находится сверху необработанных классов Java, Даты и Календаря. В основном и дата и Календарь страдают от того, что они пытаются переполнить два понятия в один класс:

  1. Дата (т.е. День месяца года)
  2. Момент (т.е. currentTimeMillis)

, Когда Вы понимаете это, это просто коренным образом изменит, как Вы обрабатываете подобные дате понятия в своем коде. Вещи будут более простыми, более ясными, лучше. В каждом смысле!

Для меня, Joda является сверхсложным, по крайней мере, для подавляющего большинства целей, и мне особенно не нравится то, что они шли вразрез со стандартными формами Java, при этом один пример был то, как они анализируют и даты формата. Stephen Colebourne, парень позади JODA, является выводом спецификации JSR-310, и это страдает от тех же проблем, по моему скромному мнению (я следовал и способствовал обсуждениям в течение последних нескольких лет).

Делают это самостоятельно; это легко. Просто заполните следующие классы: MyDate (переносящий день месяца года), Месяц (перечисление), TimeOfDay (hour-min-sec-millis), DayOfWeek (перечисление), Момент (обертывание длинного). Всегда рассматривайте часовые пояса при преобразовании между Моментами и Датами.

, Если это кажется пугающим, можно использовать Календарь и SimpleDateFormat под капотом. Вы сделаете это через день и никогда не сожалеть о нем.

0
ответ дан 1 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: