Установить дату в одну строку - PullRequest
45 голосов
/ 21 мая 2010

Согласно 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();

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

Ответы [ 8 ]

72 голосов
/ 21 мая 2010

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

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

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

22 голосов
/ 21 мая 2010

Вы можете использовать

new SimpleDateFormat( "yyyyMMdd" ).parse( "20100520" )
14 голосов
/ 21 мая 2010

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

new DateMidnight(2010, 3, 5)

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

DateTime dt = new DateTime(2010, 3, 5, 0, 0);
9 голосов
/ 21 мая 2010

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

myCal.set( theYear, theMonth, theDay );
5 голосов
/ 21 мая 2010

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

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);
4 голосов
/ 04 ноября 2015

ТЛ; др

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 в статический метод для преобразования даты.

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 и more .

2 голосов
/ 04 ноября 2015
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

1 голос
/ 29 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...