Не удалось правильно проанализировать дату для 00:00:00 и 23:59:59 EST на Java - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь передать время startDate как 00: 00: 00 , а время endDate как 23: 59: 59 , но во время отладки время startDate равно Чт Авг 09 10: 30: 00 IST 2018 и время endDate вт 14 августа 10:29:59 IST 2018 . Где я делаю не так?

SimpleDateFormat estFormat=new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
estFormat.setTimeZone(TimeZone.getTimeZone("EST"));

Date startDate=estFormat.parse(sdate+" 00:00:00");
object.setStartDate(startDate);

Date endDate=estFormat.parse(edate+" 23:59:59"); 
object.setEndDate(endDate);

предоставил sdate и edateстроки, которые имеют даты в формате ММ / дд / гггг .

РЕШЕНИЕ: ИСПОЛЬЗОВАНИЕ API JAVA-TIME

    sdate=sdate.trim()+" 00:00:00";
    edate=edate.trim()+" 23:59:59";
    DateTimeFormatter df = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
    LocalDateTime localdatetime = LocalDateTime.parse(sdate,df);
    Date startDate = Date.from(localdatetime.atZone(ZoneId.of("America/New_York" )).toInstant());
    object.setStartDate(startDate);

    localdatetime = LocalDateTime.parse(edate,df);
    Date endDate = Date.from(localdatetime.atZone(ZoneId.of("America/New_York" )).toInstant());
    object.setEndDate(endDate);

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

tl; dr

LocalDate
.of( 2018 , Month.MAY , 23 )
.atStartOfDay(
    ZoneId.of( "America/New_York" )
)

Подробности

Никогда не используйте ужасные старые унаследованные классы даты и времени, такие как Date.

Используйте современный Java.time классы.

ZoneId z = ZoneId.of( "America/New_York" ) ;
LocalDate ld = LocalDate.of( 2018 , Month.MAY , 23 ) ;
ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

При отслеживании всего дня не пытайтесь прибить последний момент.Мы обычно определяем промежуток времени, используя подход Half-Open, где начало включительно, а окончание - эксклюзивно.Таким образом, день начинается с первого момента (обычно в 00:00, но не всегда) и продолжается, но не включает первый момент следующего дня .

LocalDate dayAfter = ld.plusDays( 1 ) ;
ZonedDateTime zdtStop = dayAfter.atStartOfDay( z ) ;

Совет: добавьте библиотеку ThreeTen-Extra в свой проект, чтобы получить доступ к классу Interval.

org.threeten.extra.Interval interval = 
    Interval.of( 
        zdtStart.toInstant() ,
        zdtStop.toInstant()
    )
;

Этот класс содержит удобные методы сравнения, такие как abuts, contains, encloses, intersection и т. Д.

boolean containsMoment = interval.contains( Instant.now() ) ;

О программе 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?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 16 октября 2018

Если вы хотите время IST, просто измените с EST на IST свою строку 2:

estFormat.setTimeZone(TimeZone.getTimeZone("IST"));
...