tl; dr
Используйте строки ISO 8601 для обмена значениями даты и времени, а не число, подделываемое как дата-время.Как правило, лучше всего обмениваться моментами в UTC, а не в своем часовом поясе.
Instant
.now()
.truncatedTo( ChronoUnit.MINUTES)
.toString()
2018-12-24T19: 32: 00Z
Чтобы свести к минимуму использование разделителейиспользуйте «базовую» вариацию форматов ISO 8601.Мы сохраняем T
, отделяя часть год-месяц-день от части час-минута.Отбрасывать Z
, указывающий UTC, не рекомендуется, но если вы настаиваете.
OffsetDateTime
.now( ZoneOffset.UTC )
.format(
DateTimeFormatter.ofPattern( "uuuuMMdd'T'HHmm" )
)
20181224T1936
Использование целого числа для представления строки даты и времени не рекомендуется, но если вы настаиваете.
new BigInteger(
OffsetDateTime
.now( ZoneOffset.UTC )
.format(
DateTimeFormatter.ofPattern( "uuuuMMddHHmm" )
)
)
.toString()
201812241939
32-разрядное целое число (int
, Integer
) ограничено 2 147 483 647.Ваш фальшивый datetime номер 2,018,123,581,939 слишком велик для этого.Вы можете использовать 64-битное целое число (long
, Long
).Но, опять же, я должен сказать, что это плохой способ представления значений даты и времени.
new BigInteger(
OffsetDateTime
.now( ZoneOffset.UTC )
.format(
DateTimeFormatter.ofPattern( "uuuuMMddHHmm" )
)
)
.longValue()
201812241939
Или пропустите BigInteger
и используйте Long
.
Long
.parseLong(
OffsetDateTime
.now( ZoneOffset.UTC )
.format(
DateTimeFormatter.ofPattern( "uuuuMMddHHmm" )
)
)
201812241939
java.time
Вы используете ужасные старые классы даты и времени (SimpleDateFormat
, Calendar
) которые были вытеснены несколько лет назад классами java.time с принятием JSR 310.
ZonedDateTime
Чтобы получить текущую дату и время, как видночерез настенные часы, используемые людьми определенного региона, укажите ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
DateTimeFormatter
Чтобы сгенерировать строку в формате ГГГГММДДЧЧММ, используйте класс DateTimeFormatter
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHss" ) ;
String output = zdt.format( f ) ;
Используйте соответствующие типы данных
Я настоятельно не рекомендую вам представлять это значение как число.Для значений даты и времени используйте объекты даты и времени ( java.time объекты).Для обмена значениями даты и времени в виде текста генерируйте строки в стандартном формате ISO 8601 .Классы java.time используют форматы ISO 8601 по умолчанию при разборе / генерации строк.Метод ZonedDateTime::toString
разумно расширяет стандарт, добавляя название часового пояса в квадратных скобках.
String output = zdt.toString() ; // Generate text in standard ISO 8601 format wisely extended to append the name of the time zone in square brackets.
Но если вы настаиваете на выполнении числовых операций, то здесь.
BigInteger bigInteger = new BigInteger( zdt.format( f ) ) ;
О 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?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .