
"createTime": { "dayOfMonth": 15, "dayOfWeek": "MONDAY", "dayOfYear": 196, "month": "JULY", "year": 2019, "monthValue": 7, "hour": 14, "minute": 50, "nano": 0, "second": 40, "chronology": { "id": "ISO", "calendarType": "iso8601" } } 上述就是返回的格式。请问这是为啥,已经在 WebMvcConfigurer 配置了 pattern,并且注册到容器了。
@Bean public LocalDateTimeSerializer localDateTimeDeserializer() { return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } //注册 builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); 有没有人解答一下
1 wu67 2019-07-15 16:54:18 +08:00 exm? 你的意思是要让前端显示 yyyy-MM-dd HH:mm:ss 这样? 直接把 long 丢过去让前端处理呀 |
2 telami 2019-07-15 17:01:12 +08:00 问题有很多种解决办法,没看懂你的选择 |
4 broadliyn 2019-07-15 17:09:59 +08:00 1. 看你前段返回时候序列化是用的 spring boot 自带的,还是自己另外建的 JsonUtil 2. builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); 这个 builder 的来源是 1 里的哪一个? |
5 yinzhili 2019-07-15 17:10:36 +08:00 字段上面加注解: @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonSerialize(using = LocalDateTimeSerializer.class) |
7 scyllaEo OP |
8 cyheng 2019-07-15 17:19:36 +08:00 objectMapper addDeserializer 试一下? |
9 xfriday 2019-07-15 17:39:15 +08:00 用 RFC3339 ("2006-01-02T15:04:05Z07:00"),带上时区信息,方便前端做国际化处理 |
10 broadliyn 2019-07-15 17:40:56 +08:00 看一下,MappingJackson2HttpMessageConverter 和 JacksonAutoConfiguration 目测是配置没有生效。 |
11 npe 2019-07-15 17:43:46 +08:00 @Configuration public class ApiConfiguration implements WebMvcConfigurer { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8); } private static final String DATE_FORMAT = "yyyy-MM-dd"; private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { builder.simpleDateFormat(DATE_TIME_FORMAT); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); }; } } |
12 npe 2019-07-15 17:44:07 +08:00 ``` Java @Configuration public class ApiConfiguration implements WebMvcConfigurer { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8); } private static final String DATE_FORMAT = "yyyy-MM-dd"; private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; @Bean public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { builder.simpleDateFormat(DATE_TIME_FORMAT); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); }; } } ``` |
13 liuawei 2019-07-15 18:43:49 +08:00 配置文件里面配置这个看下 spring.mvc.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zOne=GMT+8 |
14 liuawei 2019-07-15 18:46:09 +08:00 或者重新 configureMessageConverters 这个方法 |
15 FleyX 2019-07-15 18:48:26 +08:00 关于时间的前后端交互问题,从来都是用的时间戳。客户端可以格式化为任意格式。也不存在时区转换问题。 |
16 zhady009 2019-07-15 19:15:24 +08:00 @Configuration public class LocalDateTimeFormatter { @Bean public LocalDateTimeSerializer localDateTimeDeserializer() { return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DateFormat.NORMAL_DATE)); } @Bean public LocalDateSerializer localDateDeserializer() { return new LocalDateSerializer(DateTimeFormatter.ofPattern(DateFormat.SHORT_DATE)); } @Bean public LocalTimeSerializer localTimeDeserializer() { return new LocalTimeSerializer(DateTimeFormatter.ofPattern(DateFormat.NORMAL_TIME)); } @Bean public Jackson2ObjectMapperBuilderCustomizer localDateTimeDeserializerCustomizer() { return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); } @Bean public Jackson2ObjectMapperBuilderCustomizer localDateDeserializerCustomizer() { return builder -> builder.serializerByType(LocalDate.class, localDateDeserializer()); } @Bean public Jackson2ObjectMapperBuilderCustomizer localTimeDeserializerCustomizer() { return builder -> builder.serializerByType(LocalTime.class, localTimeDeserializer()); } } |
17 alangz 2019-07-15 19:23:21 +08:00 如果用的是 Jackson,你需要配置加载 jsr310 的 JavaTimeModule 模块儿,并配置关闭 WRITE_DATES_AS_TIMESTAMPS。 |
18 alangz 2019-07-15 19:24:20 +08:00 补充下,看到你这个返回结果就是没有添加这个模块儿。 |
19 qiyuey 2019-07-15 19:45:04 +08:00 via Android 建议走 ISO 标准格式,就是带 T 的那个 |
20 WispZhan 2019-07-15 20:06:04 +08:00 via Android 请你返回时间戳谢谢。 |
21 bringyou 2019-07-15 21:40:57 +08:00 用的是 springboot 吗?是的话要配置下 JacksonSerializer 里面的 objectMapper,它里面是自己 new 出来的,不会用 #7 中的提供的 objectMapper,那个只是单纯的 objectMapper |
22 bringyou 2019-07-15 21:49:22 +08:00 #21 勘误 "那个只是单纯的 objectMapper" -> “那个 objectMapper 只是单纯的放到 context 里面,Spring 组件如 JacksonSerializer 基本不会用这个,都是自己 new 的” |
23 saberscarlet 2019-07-15 22:01:13 +08:00 via Android 是不是某个类加了 @EnableWebMvc |
24 JohnZorn 2019-07-16 08:26:22 +08:00 via Android Convert 里面 mapper 注册上 java8 模块 |
25 RRRSSS 2020-12-10 16:00:28 +08:00 处理时间这块挺麻烦的,我一般直接存时间戳,字段是 long 。然后前端自己去处理,想要什么都可以,这样他们其实更方便,对后端也更合理。 |