java.util.Date/JodaTime: учитывая java.util.Date, сгенерируйте начало и конец этой даты

Если бы мне был задан конкретный java.util.Date, как я могу сгенерировать начало и конец этой даты. Например, у меня дата August 25, 2011, тогда моя дата начала будет August 25, 2011 00 00 00, а моя дата окончания будет August 25, 2011 23 59 59.

История вопроса: (прочтите ниже, если хотите узнать, почему я задаю этот вопрос)

Я использую JPA для сопоставления date с моей базой данных MySql вот так. Я хочу, чтобы у date тоже было время, поэтому я использую TemoporalType.TIMESTAMP

@Temporal(TemporalType.TIMESTAMP)
private Date dateProcess; //java.util.Date

Мне нужно запросить все данные с определенной датой, а поскольку date хранится, как указано выше, мне нужен диапазон дат для достижения того, что я хочу.

Мой план игры состоит в том, чтобы преобразовать java.util.Date в JodaTime#DateTinme, затем построить там дату начала и окончания и преобразовать ее обратно , чтобы я мог передать в качестве параметров JPQL. Но кажется, что JodaTime очень неизменен, я не могу нигде увидеть метод установки.


person Thang Pham    schedule 07.07.2011    source источник


Ответы (3)


java.util.Date представляет мгновение во времени без привязки к часовому поясу или календарю. Одно и то же мгновение будет иметь совсем другое начало / конец дня в зависимости от часового пояса наблюдателя.

Вы можете сделать что-то вроде:

DateTime dateTime = new DateTime(date.getTime(), timeZone);
LocalDate localDate = dateTime.ToLocalDate();

DateTime startOfDay = localDate.toDateTimeAtStartOfDay(timeZone);
DateTime startOfNextDay = localDate.plusDays(1).toDateTimeAtStartOfDay(timeZone);

Из последних двух переменных вы можете вернуться к java.util.Date значениям, если хотите. Обычно они оба будут в полночь, но это может не наступить.

Обратите внимание, что вы должны использовать начало следующего дня исключительным образом, а не последнюю секунду текущего дня включительно, чтобы избежать пропущенных значений, таких как 25 августа 2011 г. 23: 59: 59.500 ...

person Jon Skeet    schedule 07.07.2011
comment
date.getDate(), date там java.util.Date? Если так, то не date.getDate() уже устарело, Джон? Разве это не должно быть date.getTime()? - person Thang Pham; 07.07.2011
comment
@Harry: Извините, я имел в виду date.getTime() - в основном способ получить значение long в миллисекундах. - person Jon Skeet; 07.07.2011
comment
Большое тебе спасибо :). Сейчас попробую. - person Thang Pham; 07.07.2011

Я считаю, что вам нужен тип DateMidnight. Сделайте новый DateMidnight и передайте ему рассматриваемый DateTime, и это займет дату в полночь утром того же дня. Затем вы также можете использовать функцию plusDays(), чтобы добавить 1 день, чтобы получить время окончания.

person aardvarkk    schedule 07.07.2011
comment
Я стараюсь избегать DateMidnight, поскольку не каждый день в каждом часовом поясе, даже есть полночь. LocalDate.toDateTimeAtStartOfDay - это лучше называть ИМО. - person Jon Skeet; 07.07.2011
comment
Круто - я этим раньше не пользовался. Спасибо! - person aardvarkk; 07.07.2011

person    schedule
comment
Это при условии, что часовой пояс системы правильный ... Я бы также предложил использовать Joda Time в качестве гораздо более удобного API ... - person Jon Skeet; 07.07.2011