springboot 前后端时间格式要求不同的处理方式,入参的时间为正常格式,出参为时间戳

本文介绍了如何统一SpringBoot后端时间格式并优化与前端交互。通过配置`application.properties`,定制Jackson序列化模块,实现日期到时间戳的转换,解决了后端时间格式不固定的问题,确保了入参和出参的一致性。同时,展示了在实体类中使用自定义序列化类`TimeStamp`将时间字段转换为时间戳,简化前端处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、一般情况下前端要求的时间格式不固定,有时需要时分秒,有时不需要,无法统一,但是后端如果按时间格式(yyyy-MM-dd HH:mm:ss)返回前端,就需要前端分别处理,比较麻烦。
最好就是直接给前端返回时间戳,让前端通过时间工具获取。
二、后端在接收前端传入的时间时,一般都是按 yyyy-MM-dd HH:mm:ss 或者 yyyy-MM-dd 的格式去接收。
这就导致入参和出参的时间格式不一致
三、解决办法
首先处理 springboot 的时间格式
application.properties配置

spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

实现方法

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.TimeZone;

@Configuration
@Slf4j
public class WebConf extends WebMvcConfigurationSupport {

	//从配置文件中获取
    @Value("${spring.jackson.date-format}")
    private String dateFormatPattern;

    @Value("${spring.jackson.time-zone}")
    private String timeZone;
    
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = converter.getObjectMapper();
        // 生成JSON时,将所有Long转换成String
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        // 时间格式化
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 这个可以引用spring boot yml 里的格式化配置和时区配置
        objectMapper.setDateFormat(new SimpleDateFormat(dateFormatPattern));
        objectMapper.setTimeZone(TimeZone.getTimeZone(timeZone));
//        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//过滤 null
        // 设置格式化内容
        converter.setObjectMapper(objectMapper);
        converters.add(0, converter);
        super.extendMessageConverters(converters);
    }
}

这时,springboot 的所有时间都是 yyyy-MM-dd HH:mm:ss 格式的,但是要求返回的是时间戳,需要重写 JsonSerializer<Date> 下的 serialize方法

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;

/**
 * @author
 * @ClassName:
 * @Description: 设置返回的时间格式
 * @date
 */
public class TimeStamp extends JsonSerializer<Date> {

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime());
    }
}

在实体类上添加注解

@JsonSerialize(using= TimeStamp.class)

实体类实例

import java.util.Date;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.tech.jzwm.manager.config.security.TimeStamp;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 用户表(Userinfo)实体类
 *
 * @author makejava
 * @Date 2021-04-12 17:28:34
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Userinfo {
    private static final long serialVersionUID = -78629171783478001L;
    @ApiModelProperty(value = "用户id", name = "userId")
    private Long userId;

    @ApiModelProperty(value = "用户名", name = "name")
    private String name;

    @ApiModelProperty(value = "用户密码", name = "password")
    private String password;

    @ApiModelProperty(value = "删除标记 0未删除 1已删除", name = "delFlag")
    private Integer delFlag;

    @ApiModelProperty(value = "创建人", name = "createUser")
    private Long createUser;

    @JsonSerialize(using= TimeStamp.class)
    @ApiModelProperty(value = "创建时间", name = "createTime")
    private Date createTime;

    @ApiModelProperty(value = "修改人", name = "updateUser")
    private Long updateUser;

    @JsonSerialize(using= TimeStamp.class)
    @ApiModelProperty(value = "修改时间", name = "updateTime")
    private Date updateTime;

}

这时,接收入参时,时间格式为正常的时间格式,出参中的时间则是时间戳的

### Java 中时间戳的相关类型及其使用方法 #### 时间戳的概念 时间戳是一种表示时间的方式,在计算机科学中通常指从某个固定起始点(通常是1970年1月1日午夜UTC)到当前时刻所经过的毫秒数或秒数。在Java中,`Timestamp` 是 `java.sql.Timestamp` 的一部分,用于更精确地记录时间,可以达到纳秒级别[^2]。 --- #### 主要的时间戳相关类型 1. **`java.util.Date`** - 表示特定瞬间的时间,默认精度为毫秒。 - 可通过其无构造函数获取当前时间,或者通过传递一个 long 型参数来创建指定时间的对象。 ```java Date date = new Date(); System.out.println(date); ``` 2. **`java.sql.Timestamp`** - 继承自 `java.util.Date`,增加了对纳秒的支持。 - 适用于数据库操作中的高精度时间存储和检索。 ```java Timestamp timestamp = new Timestamp(System.currentTimeMillis()); System.out.println(timestamp); ``` 3. **`Instant` (Java 8及以上版本新增)** - 属于新的日期时间API (`java.time`)的一部分,提供了更高层次的时间处理能力。 - 默认精度也是毫秒级,但支持更高的分辨率。 ```java Instant instant = Instant.now(); System.out.println(instant.toEpochMilli()); // 输时间戳 ``` --- #### 时间戳的操作方法 ##### 1. 获取时间戳 可以通过多种方式获得时间戳: - 使用 `System.currentTimeMillis()` 方法返回当前时间距1970年1月1日零点的毫秒数。 ```java long currentTimeMillis = System.currentTimeMillis(); System.out.println(currentTimeMillis); ``` - 利用 `Date` 对象的方法 `.getTime()`. ```java Date date = new Date(); long timestamp = date.getTime(); System.out.println(timestamp); ``` - 或者借助 `Timestamp` 类实例化对象并调用相应方法. ```java Timestamp ts = new Timestamp(System.currentTimeMillis()); System.out.println(ts.getTime()); ``` ##### 2. 将时间戳转换成可读日期格式 为了使时间戳更具可读性,常将其转为标准日期格式字符串: - 构造 `SimpleDateFormat` 并定义期望输样式, 如 `"yyyy-MM-dd HH:mm:ss"` . ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedDate = sdf.format(new Date(currentTimeMillis)); System.out.println(formattedDate); ``` ##### 3. 字符串形式日期还原至时间戳 当已知具体日期字符串时,可通过解析该字符串重新得到对应的时间戳数值. - 设置匹配输样式的 `SimpleDateFormat`, 解析目标字符串成为 `Date` 实体后再提取时间戳值. ```java try { String dateString = "2023-10-05 14:30:00"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date parsedDate = sdf.parse(dateString); long restoredTimestamp = parsedDate.getTime(); System.out.println(restoredTimestamp); } catch (ParseException e) { e.printStackTrace(); } ``` 上述过程涵盖了基本的时间戳生成、展示以及反向转化逻辑[^3]. --- #### 数据库交互场景下的应用 对于涉及数据库的应用程序而言,`Timestamp` 特别重要因为它允许保存带有微细粒度差异的数据项从而减少潜在冲突风险例如并发更新期间可能现的一致性问题等情形下非常有用. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值