Формат Java 8 LocalDateTime в представлении angularJs - PullRequest
0 голосов
/ 08 февраля 2019

Я использую пружинную загрузку с пользовательским интерфейсом angularJs, мое приложение передает java.time.LocalDateTime в анулярное представление.

Я пытаюсь использовать фильтр даты angularjs' s, как показано ниже:

{{ localDateTime | date : 'yyyy/MM/dd hh:mm:ss' }}

Но это не работает.Вывод показан ниже:

{"dayOfMonth":8,"dayOfWeek":"FRIDAY","dayOfYear":39,"month":"FEBRUARY","year":2019,"monthValue":2,"hour":14,"minute":48,"nano":87000000,"second":24,"chronology":{"id":"ISO","calendarType":"iso8601"}}

Я даже попытался добавить application.property, как предлагалось здесь .Тем не менее это выглядит как выше JSON.Может кто-нибудь, пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы можете создать пользовательский фильтр даты, который обертывает фильтр угловой даты, чтобы поддерживать способ сериализации вашего объекта Джексоном.После добавления зависимости jackson-datatype-jsr310 это должно помочь:

Угловой фильтр

angular.module('YourModule')
    .filter('localDateTime', localDateTime);

localDateTime.$inject = ['$filter'];
function localDateTime($filter) {
    return function (input, format) {
        if(!input){
            return '';
        }


        const year   = input[0] || 0;
        const month  = input[1] || 0;
        const day    = input[2] || 0;
        const hour   = input[3] || 0;
        const minute = input[4] || 0;
        const second = input[5] || 0;
        const nano   = input[6] || 0;

        const date = new Date(year, month-1, day, hour, minute, second, nano);
        return $filter('date')(date, format);
    };
}

HTML

{{yourTimeField | localDateTime: 'yyyy/MM/dd hh:mm:ss'}}

Если вы не хотите добавлять зависимость jackson-datatype-jsr310, вы можете изменить значения даты const, чтобы вместо этого использовать свойство объекта.

Примечание. Ранее у меня возникали проблемы с отправкой данных POST на сервер в формате объекта, и я был вынужден обновить зависимость

0 голосов
/ 11 февраля 2019

На самом деле Джексон (по крайней мере, если версия не слишком устарела) знает, как с этим бороться.Вам просто нужно правильно аннотировать вашу собственность:

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="EEE MMM dd HH:mm:ss Z yyyy")
@JsonProperty("created_at") 
ZonedDateTime created_at; 

См. Этот вопрос: Дата десериализации Джексона из Twitter в `ZonedDateTime`

0 голосов
/ 08 февраля 2019

Проблема в том, что по умолчанию Джексон не знает, как правильно сериализовать структуры дат Java 8 ( JSR 310 ) в JSON.В результате он возвращает всю структуру объекта, содержащую dayOfMonth, dayOfWeek, ..., как вы заметили.

Решением было бы сериализовать ваши даты в хорошо известный формат, такой как ISO-8601 строка.Для этого сначала необходимо добавить поддержку этих типов Java 8, добавив следующую зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

После этого вы должны заметить, что ваша дата сериализуется в виде массива, например:

[2019, 2, 8, 11, 0, 0, 0, 0]

Это массив, содержащий год, месяц, месяц и т. Д.Однако фильтр даты AngularJS пока не может использовать эти результаты.Правильным решением было бы отформатировать их как строку ISO-8601 без часового пояса (учитывая, что это LocalDateTime).Вы можете сделать это, отключив функцию сериализации WRITE_DATES_AS_TIMESTAMPS в Джексоне, настроив следующее свойство в application.properties :

spring.jackson.serialization.write-dates-as-timestamps=false

Теперь ваша дата будет отформатирована в виде строки, дляпример:

"2019-02-08T11:00:00.000"

Если вы посмотрите документацию фильтра даты AngularJS, вы увидите, что это правильно поддерживается:

Датаотформатировать как объект Date, миллисекунды (строка или число) или различные строковые форматы даты и времени ISO 8601 (например, yyyy-MM-ddTHH: mm: ss.sssZ и его более короткие версии, например yyyy-MM-ddTHH:mmZ, yyyy-MM-dd или yyyyMMddTHHmmssZ).

Имейте в виду, поскольку вы используете LocalDateTime, информация о часовом поясе не предоставляется, и, таким образом, фильтр даты AngularJS считает это локальным временем браузера, как упомянуто в той же документации:

Если часовой пояс не указан в строке ввода, считается, что время находится в местном часовом поясе.

Это означает, что если часовой пояс сервера отличается отв часовом поясе браузера, будут проблемы с данным временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...