Java8 java.util. Преобразование даты в java.time. ZonedDateTime

Я получаю следующее исключение при попытке преобразовать 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?

Если бы кто-то мог бы обеспечить некоторое предложение, это было бы большим.

61
задан 19 August 2014 в 10:37

2 ответа

Эти Ответ assylias и эти Ответ JB Nizet оба корректны:

  1. Вызов новый метод преобразования, добавленный к классу прежней версии, java.util.Date::toInstant .
  2. Вызов Instant::atZone , передавая ZoneId , приводя к ZonedDateTime .

enter image description here

, Но Ваш пример кода нацелен на четверти. Для этого, продолжает читать.

Четверти

Никакая потребность к обработке самокрутки четвертей. Используйте класс, уже записанный и протестированный.

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.

<час>

приблизительно [1 165] 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] .

2
ответ дан 31 October 2019 в 15:42

Ответ не работал на меня на 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)
0
ответ дан 31 October 2019 в 15:42

Другие вопросы по тегам:

Похожие вопросы: