Конвертируйте Joda LocalDate или java.util.Date в LocalDateTime, имея время в начале дня.

1

Я использую 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

Теги:
datetime
jodatime

2 ответа

2
Лучший ответ

Ну, как только вы избавитесь от аномалий часовых поясов, вы можете просто предположить, что каждый день начинается в полночь, поэтому используйте:

LocalDateTime localDateTime = localDate.toLocalDateTime(LocalTime.MIDNIGHT);

Непонятно, почему вы хотели закончить в 1 секунду за полночь. Если вы действительно этого хотите, создайте свой собственный постоянный LocalTime представляющий это, и используйте его вместо MIDNIGHT в приведенном выше коде.

Также обратите внимание, что если у вас действительно есть Date, возможно, у вас уже есть потерянная информация. Похоже, что входящие данные действительно являются строкой - вам лучше всего LocalDate это непосредственно как LocalDate чтобы избежать часовых поясов, потенциально вызывающих проблемы.

0

ТЛ; др

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.
) ;

java.time

Проект 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.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?

  • Java SE 8, Java SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии реализаций пакетов Android классов java.time.
    • Для более ранних Android (<26), то ThreeTenABP проект адаптирует ThreeTen-Backport (упоминалось выше). См. Раздел Как использовать ThreeTenABP....

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и другие.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню