Я использую Joda 2.5
Перед лицом проблемы при преобразовании Joda LocalDate в LocalDateTime.
Как, я могу преобразовать LocalDate в DateTime с Time atStartOfDay. Мне нужна такая же функция, но через объект LocalDateTime.
Мой код:
Предположим, что дата исходит из разных служб REST, скажем,
Date currentDate = new Date("2015-02-05");
И теперь эта дата передается на другую услугу, как показано ниже:
funService(currentDate);
public funService(Date currentDate)
{
LocalDate localDateObject = new LocalDate(date);
// Now I have to convert this Date to LocalDateTime
LocalDateTime localDateTime = localDateObject.toDateTimeAtStartOfDay();
//But this returns DateTime Object.
// As I don't want to store the DateTime Object because it also stores the TimeZone
}
Я хочу объект LocalDateTime, поскольку я храню это LocalDateTime как временную метку в mysql.
Предоставьте решение для преобразования в LocalDate в LocalDateTime Object.
Например: '2015-02-01' до '2015-02-01 00:00:01' ГГГГ-ММ-ДД до ГГГГ-ММ-ДД ЧЧ: ММ: СС: zzz
Но не LocalDate to DateTime
Ну, как только вы избавитесь от аномалий часовых поясов, вы можете просто предположить, что каждый день начинается в полночь, поэтому используйте:
LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);
Непонятно, почему вы хотели закончить в 1 секунду за полночь. Если вы действительно этого хотите, создайте свой собственный постоянный LocalTime
представляющий это, и используйте его вместо MIDNIGHT
в приведенном выше коде.
Также обратите внимание, что если у вас действительно есть Date
, возможно, у вас уже есть потерянная информация. Похоже, что входящие данные действительно являются строкой - вам лучше всего LocalDate
это непосредственно как LocalDate
чтобы избежать часовых поясов, потенциально вызывающих проблемы.
myPreparedStatement.setObject( // Insert object into database for 'TIMESTAMP WITHOUT TIME ZONE' type of column.
… ,
LocalDate.parse( "2015-02-05" ) // Parse input string to a date-only value lacking time-of-day and lacking time zone.
.atStartOfDay() // Determine start of a generic 24-hour day for a 'LocalDateTime' object lacking offset-from-UTC and lacking time zone.
) ;
Проект Joda-Time теперь находится в режиме обслуживания, а команда советует перейти на классы java.time. См. Учебник от Oracle.
Разбор входной строки
LocalDate ld = LocalDate.parse( "2015-02-05" ) ;
Если ваша бизнес-проблема не имеет какого-либо смещения от UTC или часового пояса, это не конкретный момент на временной шкале, а затем получите первый момент общего 24-часового дня, перейдя на LocalDateTime
.
LocalDateTime ldt = ld.atStartOfDay() ;
ldt.toString(): 2015-02-05T00: 00
Чтобы сохранить это в базе данных в столбце типа данных, аналогичном стандартным типом SQL TIMESTAMP WITHOUT TIME ZONE
, используйте объекты java.time с драйвером JDBC, совместимым с JDBC 4.2 и более поздними версиями. Лучше обмениваться объектами с вашей базой данных, а не просто строками.
myPreparedStatement.setObject( … , ldt ) ;
…а также…
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
Если ваша бизнес-проблема предполагает смещение или зону, вы должны указать, чтобы получить фактическую точку на временной шкале.
Первый момент дня - не всегда 00:00:00. Аномалии, такие как летнее время (DST), означают, что день может начаться в другое время, например, 01:00:00. Пусть java.time определит первый момент дня с вызовом LocalDate::atStartOfDay
.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString(): 2015-02-05T00: 00 + 01: 00 [Африка/Тунис]
Обменивайте объекты java.time с вашей базой данных, как показано выше. Если вы пытаетесь записать фактические моменты в истории, столбец базы данных должен иметь тип, эквивалентный стандарту SQL TIMESTAMP WITH TIME ZONE
.
myPreparedStatement.setObject( … , zdt ) ;
…а также…
LocalDateTime ldt = myResultSet.getObject( … , ZonedDateTime.class ) ;
Ваш драйвер и/или база данных, вероятно, преобразуют такие значения в зонирование в значение UTC. Или вы можете сделать это явно сами. Извлечь Instant
объект, который всегда находится в UTC.
myPreparedStatement.setObject( … , zdt.toInstant() ) ;
…а также…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.
Вы можете обменивать объекты java.time непосредственно с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где можно получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.