tl; dr
Используйте современные java.time классы.
LocalDate.parse(
"13-09-2011" ,
DateTimeFormatter.ofPattern( "dd-MM-uuuu" )
)
.atStartOfDay(
ZoneId.of( "Africa/Casablanca" ) // Or use `ZoneOffset.UTC` instead of a zone.
)
.toInstant()
.toEpochMilli()
См. Этот код, запущенный на IdeOne.com .
1315872000000
Подробности
По-видимому, вы хотите представить первый момент определенной даты в виде миллисекунд с начала отсчета эпохи первого момента1970 года в UTC.
java.time
Современный подход использует классы java.time , которые несколько лет назад вытеснили такие классные классы, как Date
, Calendar
и SimpleDateFormat
.
Сначала проанализируйте вашу входную строку как LocalDate
, для значения только на дату без времени суток и без часового пояса.
Совет:Вместо того, чтобы использовать такие пользовательские форматы при обмене значениями даты и времени в виде текста, используйте стандартные форматы ISO 8601 .Классы java.time используют их по умолчанию при разборе / генерации строк.
String input = "13-09-2011" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;
Определение первого момента дня в эту дату.Для этого требуется часовой пояс.В любой момент времени дата меняется по всему миру в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .
Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться.Лучше указать желаемый / ожидаемый часовой пояс явно в качестве аргумента.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Никогда не предполагайте, что день начинается в 00:00.В некоторых зонах в некоторые даты день может начинаться в другое время, например в 01:00.Пусть java.time определит первый момент.
ZonedDateTime zdt = ld.startOfDay( z ) ; // Determine first moment of the day on this date in this zone. May not be 00:00.
Настройте UTC из этой зоны, извлекая Instant
.
Instant instant = zdt.toInstant() ;
Получите счет в миллисекундахс 1970-01-01T00: 00Z.Остерегайтесь возможной потери данных, так как Instant
имеет лучшее разрешение наносекунд.Любые микросекунды или наносекунды будут игнорироваться.
long millisecondsSinceEpoch = instant.toEpochMilli() ;
Вы можете вернуться в другом направлении, от периода отсчета до Instant
.
Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch) ;
О 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?