Установить дату в одной строке
В соответствии с API Java конструктор Date(year, month, day)
обесценивается. Я знаю, что я могу заменить его следующим кодом:
Calendar myCal = Calendar.getInstance();
myCal.set(Calendar.YEAR, theYear);
myCal.set(Calendar.MONTH, theMonth);
myCal.set(Calendar.DAY_OF_MONTH, theDay);
Date theDate = myCal.getTime();
Тем не менее, я бы хотел, чтобы что-то было короче, чтобы заменить его (в идеале от одной до двух строк).
Ответы
Ответ 1
Вы можете использовать new GregorianCalendar(theYear, theMonth, theDay)
.getTime()
:
public GregorianCalendar(int year, int month, int dayOfMonth)
Создает GregorianCalendar с заданной датой, установленной в часовом поясе по умолчанию с локалью по умолчанию.
Ответ 2
Вы можете использовать
new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
Ответ 3
Это еще одна причина использовать Joda Time
new DateMidnight(2010, 3, 5)
DateMidnight теперь устарела, но тот же эффект может быть достигнут с помощью Joda Time DateTime
DateTime dt = new DateTime(2010, 3, 5, 0, 0);
Ответ 4
В календаре есть метод set(), который может установить год, месяц и день месяца за один вызов:
myCal.set( theYear, theMonth, theDay );
Ответ 5
Почему бы вам просто не написать простой метод утилиты:
public final class DateUtils {
private DateUtils() {
}
public static Calendar calendarFor(int year, int month, int day) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, day);
return cal;
}
// ... maybe other utility methods
}
И затем назовите это везде в остальной части вашего кода:
Calendar cal = DateUtils.calendarFor(2010, Calendar.MAY, 21);
Ответ 6
ТЛ; др
LocalDate.of( 2015 , Month.JUNE , 7 ) // Using handy 'Month' enum.
…или же…
LocalDate.of( 2015 , 6 , 7 ) // Sensible numbering, 1-12 for January to December.
java.time
Среда java.time, встроенная в Java 8 и более поздние версии, заменяет проблемные старые классы, java.util.Date/.Calendar.
Классы java.time используют неизменяемые объекты. Таким образом, они по своей природе потокобезопасны. У вас не будет проблем с безопасностью потоков, упомянутых в других ответах.
LocalDate
Эта структура включала класс для объектов только для даты без какого-либо времени суток или часового пояса, LocalDate
. Обратите внимание, что часовой пояс (ZoneId
) необходим для определения даты.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Вы можете создать экземпляр для конкретной даты. Обратите внимание, что число месяцев - разумный диапазон 1-12 в отличие от старых классов.
LocalDate localDate = LocalDate.of( 2015 , 6 , 7 );
Или используйте перечисление, Month
.
LocalDate localDate = LocalDate.of( 2015 , Month.JUNE , 7 );
Перерабатывать
Лучше всего избегать старых классов даты и времени. Но если вам нужно, вы можете обратить. Вызовите новые методы, добавленные к старым классам, чтобы облегчить преобразования.
В этом случае нам нужно указать время суток, чтобы согласовать его со значением только для даты, которое будет объединено для объекта java.util.Date
. Первый момент дня, вероятно, имеет смысл. Пусть java.time определяет время этого первого момента, поскольку оно не всегда 00:00:00.0
.
Нам также нужно указать часовой пояс, так как дата зависит от часового пояса.
ZoneId zoneId = zoneId.of( "America/Montreal" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
Instant
- это базовый класс в java.time, представляющий момент времени на UTC. Поток Instant
статический метод на дату для преобразования.
Instant instant = zdt.toInstant();
java.util.Date utilDate = java.util.Date.from( instant );
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытеснять неприятные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск для многих примеров и объяснений. Спецификация JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 7
Date date = new DateTime(2014, 6, 20, 0, 0).toDate();
DateTime от Joda.org https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html
Ответ 8
Используйте конструктор Date(year,month,date)
в Java 8, он устарел:
Date date = new Date(1990, 10, 26, 0, 0);
Лучший способ - использовать SimpleDateFormat
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date date = format.parse("26/10/1985");
вам нужно импортировать import java.text.SimpleDateFormat;