当前位置: 首页 > 知识库问答 >
问题:

Spring boot:使用ISO格式的本地时间序列化

徐佐
2023-03-14

在一个非常简单的Spring boot反应式项目中,没有特定的配置(但下面尝试的配置),我需要以ISO形式序列化LocalTime(以及相关的类,比如LocalDate)。默认情况下,每个属性都是单独序列化的,这从对象的角度来看是有意义的。但我需要ISO格式的单字符串属性。

有人多次提到这个问题,比如这里、这里或这里较小的程度。

没用。我想知道我做错了什么,或者这些链接是否只是过时了,以及自那以后spring中的机制是否更新/更改了。

我所做的中心测试是通过让一个bean注册相应的模块:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class MyConfiguration {

    @Bean
    @Primary
    public ObjectMapper customJson() {
        ObjectMapper mapper = new Jackson2ObjectMapperBuilder()
                .build();

        mapper.registerModule(new JavaTimeModule());
        return mapper;
    }
}

我识别序列化不是ISO格式的方法是查看我对象的大摇大摆的ui描述,显示我的endTime属性,如下所示(当我试图实现的实际结果是“endTime”:“某个ISO字符串”):

"endTime": {
  "hour": 0,
  "minute": 0,
  "nano": 0,
  "second": 0
},

所以问题是:如何在Spring Boot(被动)中为LocalDate配置单字符串格式?

共有2个答案

万涵亮
2023-03-14

您可以通过禁用jackson中的WRITE_DATES_AS_TIMESTAMPS功能来实现您的目标

ObjectMapper mapper = Jackson2ObjectMapperBuilder.json()
                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 
                .modules(new JavaTimeModule())
                .build();

这将使它以ISO格式序列化

胡霖
2023-03-14

你需要做这样的事情:

public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    System.out.println(objectMapper.writeValueAsString(new Entity()));
}

static class Entity {
    LocalTime time = LocalTime.now();

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss.SSS")
    public ZonedDateTime getTime() {
        return time;
    }
}

这是这个问题的修改引文

 类似资料:
  • 我试图理解UTC和ISO格式之间的区别,以及在服务器之间传输消息时使用什么。所以当我尝试以下方法时,我得到的是

  • 问题内容: 我正在创建我的JavaFX应用程序,每次创建新的列表单元格时都需要使用时间标签。我需要将当前时间的字符串格式直接放入作为参数的Label构造函数中。 我发现并使用了: 但是它显示了错误的时区,所以我将使用和分类。 有没有办法在一行中实现相同的字符串结果?谢谢您的帮助 :) 问题答案: 在新的应用程序中使用Java 8类型(java.time)可能更好。您可以先创建一个: 然后获取当前时

  • 我有一个关于格式化程序的问题。 在SWAPI(https://SWAPI.co/documentation#people)中,您可以读取和日期,其格式如下: 但是在预定义格式化程序中的类DateTimeFormatter的文档一节中,我看不到任何与SWAPI日期示例匹配的格式化程序。

  • 我知道有人问过这个问题,但没有提供解决方案。Python UTC日期时间对象的ISO格式不包括Z(Zulu或零偏移) 我正在寻找一种在Python中用这种格式生成UTC时间戳的干净方法。我需要的格式是。 具体来说,我需要在最后加上“Z”。Python的不会在末尾附加Z。 请注意,手动添加“Z”不是我可以接受的解决方案。我正在寻找一个干净的方法来做到这一点。 以ISO格式生成带后缀的UTC时间戳的干

  • 我正在寻找javascript/jquery库,它可以为我提供UI和功能来选择ISO 8601格式的持续时间。 用户界面应包含多个级联选择框,用户可以选择月,小时,天,周...在ISO_8601中定义。 选择后,库应将其转换为标准ISO_8601持续时间格式的代码,反之亦然。 例如,“P3Y6M4DT12H30M5S”表示持续时间为“三年六个月四天十二小时三十分五秒”。

  • 我有一个ISO 8601格式的持续时间,例如:PT5M或PT120S。 有没有什么方法可以使用moment.js解析这些并获取持续时间中指定的分钟数? 谢谢大家! PS:我研究了解析ISO 8601持续时间,并将ISO 8601时间格式转换为正常持续时间 但很想知道这是否可行。