2010-03-04 5 views
12

Могу ли я узнать, что является наиболее эффективным способом создания объекта даты с использованием определенного дня, месяца и года.Дата создания - эффективный способ

Date(int year, int month, int day) 

Эта конструкция амортизируется. Следовательно, то, что я обычно делаю:

Calendar calendar = Calendar.getInstance(); 
Date date = calendar.set(year, month, date).getTime(); 

Однако, я понимаю, что Calendar.getInstance() довольно дорого. Каков наиболее эффективный способ создания объекта Date? Или я должен просто использовать Date (int year, int month, int day) спокойно, не рассказывая остальным?

Пожалуйста, не предлагайте использовать стороннюю библиотеку.

+1

Какая-либо конкретная причина не для использования сторонней библиотеки? Joda Time - это намного лучший API, чем встроенные. Если у вас есть действительно, действительно хорошая причина не использовать его, я настоятельно рекомендую вам перейти на него. –

+1

Yup. Я знаю, что 9 из 10 предложит мне использовать Joda Time. Вот почему я помещаю замечание в стороннюю библиотеку :) –

+0

Я думаю, что если вы не хотите каких-либо библиотек, вы в значительной степени застреваете. Как правило, 4 из 5 разработчиков рекомендуют Joda Time для любой связанной даты. – sfussenegger

ответ

15

С помощью этого вы можете избежать создания инкрементного экземпляра «теперь время».

Date coolDate = new GregorianCalendar(year, month, day).getTime(); 

Вы можете проверить GregorianCalendar javadoc для других конструкторов. У вас есть дата + время и часовой пояс.

Так или иначе, я согласен с Джоном Скитом, что это не так дорого. Я согласен с вами, что для кода не требуется инициализация по умолчанию «now».

+0

+1 для создания напрямую, но будьте осторожны с использованием определенного Календаря. – medopal

+0

Да. Я понимаю, что использование дня, месяца и года подразумевает знание о используемом календаре (но если это общая обработка DMY ... нет способа создания календаря ... :) – helios

+1

Точка использования 'Calendar.getInstance () ', чтобы разрешить различия, зависящие от локали. Создание «GregorianCalendar» напрямую отбрасывает выгоду для сохранения ... одной строки кода. Было бы лучше просто создать создание в статическом заводском методе. – cletus

6

«Довольно дорого» несколько расплывчато. Вы на самом деле пытались использовать код, который вы поставили, измерили его и нашли, что он тоже дорогой? У вас есть конкретное представление о том, насколько дешево вам нужна эта операция?

Кроме того, вы не указали, в каком часовом поясе вы хотите указать значение в Date. УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ? Часовой пояс по умолчанию? В какое время вы хотите, чтобы это было - полночь или текущее время суток? Ваш текущий код сохранит существующее время суток - это действительно то, что вы хотите?

(Как я упоминал в комментарии, я настоятельно рекомендую вам перейти на Joda Time - но даже если вы этого не сделаете, вы все равно должны проверить, действительно ли у вас возникла проблема с вашим существующим кодом перед тем, как смотреть для решения.)

+2

Время Джоды, вероятно, слишком велико. «Дорого» по отношению к Календари - это то, что было правдой в JDK за 1.4 дня, которое сохранилось. Я был под тем же самым заблуждением, что и OP, пока не проверил его и мог легко создать сотни тысяч из них, второй проблемы. – cletus

+2

@cletus: Большая часть моей рекомендации рекомендовать Joda Time - не ускорить это - это использовать лучший API. Я предполагаю, что если он создаст дату, он тоже будет использовать ее. Joda Time - это просто лучший способ обработки дат и времени, периода. –

+1

Нужно ли задаваться вопросом, стало ли время Joda для Java тем, что jQuery стало для Javascript: что-то всегда предлагалось. :) – cletus

1

Все, что вы используете, так долго, как это в Java Standard API, он будет включать в себя использование Calendar (как Date конструктор и SimpleDateFormat использовать его внутри), так что нет никакого смысла разъедающий о предполагаемой неэффективности этого класса.

1

Я бы просто сделать это:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
Date thisDate = formatter.parse("2010-03-04"); 

Это довольно эффективно в строках кода точки зрения; Я не могу говорить о его эффективности во время работы с календарем.

Смежные вопросы