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