如何在春季禁用将 ZonedDateTime 字段的时区转换为 UTC,仅用于一个字段并将其保留用于所有其他字段?

Posted

技术标签:

【中文标题】如何在春季禁用将 ZonedDateTime 字段的时区转换为 UTC,仅用于一个字段并将其保留用于所有其他字段?【英文标题】:How to disable converting the timezone of a ZonedDateTime field to UTC in spring, only for one field and keep it for all other fields? 【发布时间】:2021-10-27 17:23:15 【问题描述】:

我有一个 Spring Boot 应用程序,当 RESTful API 接收到具有 ZonedDateTime 字段的请求正文时,ZonedDateTime 字段的时区将转换为 UTC。如何让应用程序只为一个字段保留原始时区,并将其转换为所有其他字段的 UTC?

我知道我们可以通过将以下行添加到属性文件中来为所有字段禁用此功能,但在我的情况下,我不想为所有字段禁用它,我只想为一个字段禁用它。

spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false

【问题讨论】:

【参考方案1】:

可以使用JsonFormat注解:

@JsonFormat(without = ADJUST_DATES_TO_CONTEXT_TIME_ZONE)

看看下面的例子:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.File;
import java.io.IOException;
import java.time.ZonedDateTime;

import static com.fasterxml.jackson.annotation.JsonFormat.Feature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE;

public class ZonedJsonApp 

    public static void main(String[] args) throws IOException 
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();
        JsonMapper mapper = JsonMapper.builder()
                .addModule(new JavaTimeModule())
                .build();
        System.out.println(mapper.readValue(jsonFile, ZonedPojo.class));
    


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
class ZonedPojo 
    private ZonedDateTime with;

    @JsonFormat(without = ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
    private ZonedDateTime without;

以下JSON有效载荷:


  "with": "2007-12-03T10:15:30+04:00",
  "without": "2007-12-03T10:15:30+04:00"

打印:

ZonedPojo(with=2007-12-03T06:15:30Z[UTC], without=2007-12-03T10:15:30+04:00)

【讨论】:

不幸的是它对我不起作用,我在我的项目中添加了完全相同的代码并运行代码。这是我得到的: ZonedPojo(with=2007-12-03T06:15:30Z[UTC], without=2007-12-03T06:15:30Z[UTC]) @MoA,你用的是哪个版本的 Jackson 和 Spring Boot? Spring boot 版本是'2.4.5'。我还在我的项目中使用依赖项“org.springframework.boot:spring-boot-starter-webflux”和“io.springfox:springfox-boot-starter:3.0.0”。我不直接用Jackson,spring boot自带的,版本是com.fasterxml.jackson.core:jackson-databind:2.11.4 我必须明确添加下面的依赖项才能使其工作,不幸的是,spring boot 中包含的传递 Jackson 依赖项不起作用。实现组:'com.fasterxml.jackson.datatype',名称:'jackson-datatype-jsr310',版本:'2.12.4' @MoA,我很高兴听到这个消息。总是值得添加所有Java 8 modules、Force Jackson serialize LocalDate to Array

以上是关于如何在春季禁用将 ZonedDateTime 字段的时区转换为 UTC,仅用于一个字段并将其保留用于所有其他字段?的主要内容,如果未能解决你的问题,请参考以下文章

在时区将 ZonedDateTime 转换为 LocalDateTime

如何将 ZonedDateTime 格式化为字符串?

如何在 Java 中将 ZonedDateTime 转换为毫秒?

如何使用 ZonedDateTime 或 Java 8 将任何日期时间转换为 UTC

如何将RFC 3339日期字符串解析为ZonedDateTime?

如何将 TIMESTAMP 列映射到 ZonedDateTime JPA 实体属性?