getActualMinimum с HOUR в качестве аргумента Календаря возвращает 12 в Java - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь установить время calendar, вызывая метод calendar.set(Calendar.HOUR, calendar.getActualMinimum(Calendar.HOUR)); Но getActualMinimum(Calendar.HOUR) возвращает 12 вместо 0.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

tl; dr

Используйте java.time классы, а не классы устаревших классов.

Чтобы получить первый момент дня, звоните LocalDate.atStartOfDay( ZoneId ).

LocalDate.now(                       // Represent the date alone, without time-of-day and without time zone.
    ZoneId.of( "Africa/Tunis" )      // Specify the time zone in which to determine the current date.
)
.withDayOfYear( 1 )                  // Or `.withDayOfMonth(1)` or `.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY) )`.
.atStartOfDay(                       // Determine the first moment of the day on that particular date in that particular zone.
    ZoneId.of( "Africa/Tunis" )
)                                    // Returns a `ZonedDateTime` object.
.toInstant()                         // Same moment, as seen in UTC.
.toEpochMilli()                      // Extract a count of milliseconds since the epoch reference of 1970-01-01T00:00:00Z. 

java.time

Вы используете проблемные старые классы даты и времени, которые теперь унаследованы, заменены java.time классы.

Для получения текущей даты и времени требуется часовой пояс.В любой момент времени дата и время меняются по всему земному шару в зависимости от зоны.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Извлекайте только часть даты этой даты со временем.

LocalDate ld = zdt.toLocalDate() ;

Из этогоdate, позвольте java.time определить первый момент дня.Никогда не предполагайте, что день начинается в 00:00:00.Аномалии, такие как летнее время (DST), означают, что день может начаться в другое время, например 01: 00: 00.

java.time классы используют неизменяемые объекты .Вместо того, чтобы изменять свойство объекта («mutate»), новый новый объект создается на основе значений оригинала.

ZonedDateTime zdtResult = null ;

Для вашего оператора switch используйте существующий ChronoUnit перечислениеИз-за странной технической проблемы оператор switch не может использовать квалифицированное имя перечисления.Таким образом, мы должны использовать YEARS вместо ChronoUnit.YEARS, например, в качестве переменной switch.Используйте статический импорт для доступа к перечислению.

import static java.time.temporal.ChronoUnit ;
…

switch ( unit ) {
    case YEARS : 
        zdtResult = ld.withDayOfYear( 1 )
                      .atStartOfDay( z ) ;
        break;

    case MONTHS : 
        zdtResult = ld.withDayOfMonth( 1 )
                      .atStartOfDay( z ) ;
        break;

    case WEEKS : 
        zdtResult = ld.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY) )
                      .atStartOfDay( z ) ;
        break;

    default: …
}

Из полученного ZonedDateTime извлеките объект Instant, чтобы увидеть тот же момент в UTC.

Instant instant = zdtResult.toInstant() ;

Похоже, что целью вашего Вопроса является подсчет миллисекунд с начала эпохи первого момента 1970 года в UTC.Я настоятельно рекомендую не использовать простое число long для отслеживания значений даты и времени.Делает отладку и трассировку проблематичной, а ошибки могут остаться незамеченными.Обходите и храните Instant объектов вместо этого.

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

long millisSinceEpoch = instant.toEpochMillis() ;

Обратите внимание, как использование java.time делает для кодаэто короче, аккуратнее и гораздо более читабельно.


О java.time

java.time *Платформа 1077 * встроена в 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 API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 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… .

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

0 голосов
/ 13 мая 2018

Попробуйте использовать Calendar.HOUR_OF_DAY.

...