it-roy-ru.com

Установить дату в одну строку

Согласно Java API, конструктор 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();

Тем не менее, я хотел бы заменить его чем-то более коротким (в идеале одна-две строки).

40
hibernate

Вы можете использовать new GregorianCalendar(theYear, theMonth, theDay).getTime():

public GregorianCalendar(int year, int month, int dayOfMonth)

Создает GregorianCalendar с заданной датой, установленной в часовом поясе по умолчанию с локалью по умолчанию. 

70
aioobe

Вы могли бы использовать

new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
21
tangens

Это еще одна причина использовать Joda Time

new DateMidnight(2010, 3, 5)

DateMidnight устарела, но тот же эффект может быть достигнут с Joda Time DateTime

DateTime dt = new DateTime(2010, 3, 5, 0, 0);
14
Sean Owen

В календаре есть метод set () , который может установить год, месяц и день месяца за один вызов:

myCal.set( theYear, theMonth, theDay );
9
martin clayton

Почему бы вам просто не написать простой служебный метод:

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);
5
Jesper

тЛ; др

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 используют неизменяемые объекты . Таким образом, они по своей природе потокобезопасны. У вас не будет ни одной из проблем thread-safety , упомянутых в других ответах.

LocalDate

Эта структура включала в себя класс только для объектов даты без какого-либо времени суток или часового пояса, LocalDate . Обратите внимание, что часовой пояс (ZoneId) необходим для определения даты. 

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

Вы можете создать экземпляр для конкретной даты. Обратите внимание, что число месяцев - разумный диапазон 1-12 в отличие от старых классов. 

LocalDate localDate = LocalDate.of( 2015 , 6 , 7 );

Или используйте enum, 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 статическому методу в Date для конвертации.

Instant instant = zdt.toInstant();
Java.util.Date utilDate = Java.util.Date.from( instant );

О Java.time

Java.time framework встроен в 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 , и more .

4
Basil Bourque
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

2
Cheng

Используйте конструктор 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;

0
GAbriel lopez