Я получаю следующее исключение при попытке преобразовать java.util.Date
кому: java.time.LocalDate
.
java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: 2014-08-19T05:28:16.768Z of type java.time.Instant
Код следующие:
public static Date getNearestQuarterStartDate(Date calculateFromDate){
int[] quaterStartMonths={1,4,7,10};
Date startDate=null;
ZonedDateTime d=ZonedDateTime.from(calculateFromDate.toInstant());
int frmDateMonth=d.getMonth().getValue();
Есть ли что-то не так в способе, которым я использую ZonedDateTime
класс?
Согласно документации, это должно преобразовать a java.util.Date
объект к ZonedDateTime
. Форматом даты выше является стандартная Дата?
Я имею к нейтрализации на времени Joda?
Если бы кто-то мог бы обеспечить некоторое предложение, это было бы большим.
Эти Ответ assylias и эти Ответ JB Nizet оба корректны:
java.util.Date::toInstant
. Instant::atZone
, передавая ZoneId
, приводя к ZonedDateTime
. , Но Ваш пример кода нацелен на четверти. Для этого, продолжает читать.
Никакая потребность к обработке самокрутки четвертей. Используйте класс, уже записанный и протестированный.
org.threeten.extra.YearQuarter
java.time классы расширяются ThreeTen-дополнительный проект. Среди многих удобных классов, обеспеченных в той библиотеке, Вы найдете Quarter
и YearQuarter
.
Первый получают Ваш ZonedDateTime
.
ZonedId z = ZoneID.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = myJavaUtilDate.toInstant().atZone( z ) ;
Определяют четверть года для той конкретной даты.
YearQuarter yq = YearQuarter.from( zdt ) ;
Следующий нам нужна дата начала той четверти.
LocalDate quarterStart = yq.atDay( 1 ) ;
, В то время как я не обязательно рекомендую делать так, Вы могли использовать одну строку кода, а не реализовать метод.
LocalDate quarterStart = // Represent a date-only, without time-of-day and without time zone.
YearQuarter // Represent a specific quarter using the ThreeTen-Extra class `org.threeten.extra.YearQuarter`.
.from( // Given a moment, determine its year-quarter.
myJavaUtilDate // Terrible legacy class `java.util.Date` represents a moment in UTC as a count of milliseconds since the epoch of 1970-01-01T00:00:00Z. Avoid using this class if at all possible.
.toInstant() // New method on old class to convert from legacy to modern. `Instant` represents a moment in UTC as a count of nanoseconds since the epoch of 1970-01-01T00:00:00Z.
.atZone( // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone). Same moment, same point on the timeline, different wall-clock time.
ZoneID.of( "Africa/Tunis" ) // Specify a time zone using proper `Continent/Region` format. Never use 2-4 letter pseudo-zone such as `PST` or `EST` or `IST`.
) // Returns a `ZonedDateTime` object.
) // Returns a `YearQuarter` object.
.atDay( 1 ) // Returns a `LocalDate` object, the first day of the quarter.
;
Между прочим, если можно постепенно сократить использование [1 112] в целом, делают так. Это ужасно класс, наряду с его одноуровневыми элементами такой как [1 113]. Используйте Date
только там, где Вы должны, когда Вы взаимодействуете через интерфейс со старым кодом, еще не обновленным к [1 164] java.time.
платформа java.time встроена в Java 8 и позже. Эти классы вытесняют неприятное старое наследие классы даты и времени такой как [1 135] java.util.Date
, Calendar
, & SimpleDateFormat
.
Для узнавания больше посмотрите Учебное руководство Oracle. И ищите Переполнение стека много примеров и объяснения. Спецификация JSR 310.
Joda-разовый проект, теперь в [1 141] режим техобслуживания , советует миграции java.time классы.
можно обмениваться , java.time возражает непосредственно с базой данных. Используйте драйвер JDBC, совместимый с [1 144] JDBC 4.2 или позже. Никакая потребность в строках, никакая потребность в [1 118] классы.
, Где получить java.time классы?
ThreeTen-дополнительный проект расширяет java.time с помощью дополнительных классов. Этот проект является испытательным полигоном для возможных будущих дополнений к java.time. Можно найти некоторые полезные классы здесь таким как [1 157] Interval
, YearWeek
, YearQuarter
, и [еще 1160] .
Ответ не работал на меня на Java 10, хранящем util. Дата в UTC.
Date.toInstant (), кажется, преобразовывает EpochMillis в зону местного времени сервера.
ZDT.ofInstant (момент, zoneId) и instant.atZone (zoneId), кажется, просто наклеивают TZ тотчас, но он уже испорчен с.
я не мог найти способ предотвратить Date.toInstant () от питания со временем UTC с зоной системного времени.
единственный способ, которым я нашел для работы вокруг этого, состоял в том, чтобы пройти sql. Класс метки времени:
new java.sql.Timestamp(date.getTime()).toLocalDateTime()
.atZone(ZoneId.of("UTC"))
.withZoneSameInstant(desiredTZ)