返回顶部
首页 > 资讯 > 精选 >SpringBoot中如何实现时间格式化
  • 768
分享到

SpringBoot中如何实现时间格式化

2023-06-20 17:06:09 768人浏览 安东尼
摘要

小编给大家分享一下SpringBoot中如何实现时间格式化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!时间问题演示为了方便演示,我写了一个简单 Spring Boot 项目,其中数据库中包含了一张 userinfo 表,

小编给大家分享一下SpringBoot中如何实现时间格式化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

时间问题演示

为了方便演示,我写了一个简单 Spring Boot 项目,其中数据库中包含了一张 userinfo 表,它的组成结构和数据信息如下:

SpringBoot中如何实现时间格式化

项目目录是这样的:

SpringBoot中如何实现时间格式化

UserController 实现代码如下:

@RestController@RequestMapping("/user")publicclass UserController {    @Resource    private UserMapper userMapper;    @RequestMapping("/list")    public List<UserInfo> getList() {        return userMapper.getList();    }}

UserMapper 实现代码如下:

@Mapperpublicinterface UserMapper {    public List<UserInfo> getList();}

UserInfo 实现代码如下:

@Datapublicclass UserInfo {    privateint id;    private String username;    private Date createtime;    private Date updatetime;}

UserMapper.xml 实现代码如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""Http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper">    <select id="getList" resultType="com.example.demo.model.UserInfo">        select * from userinfo    </select></mapper>

经过以上内容的编写,我们就制作出了一个简单的 spring Boot 项目了。接下来,我们使用 PostMan 来模拟调用 UserController 接口,执行结果如下:

SpringBoot中如何实现时间格式化

从上述结果可以看出,时间字段 createtime 和 updatetime 的显示方式是很“凌乱”的,并不符合我们的阅读习惯,也不能直接展示给前端的用户使用,这时候,我们就需要对时间进行格式化处理了。

时间格式化的方法总共包含以下 5 种。

1.前端时间格式化

如果后端在公司中拥有绝对的话语权,或者是后端比较强势的情况下,我们可以将时间格式化的这个“锅”强行甩给前端来处理。

为了让这个“锅”甩的更平顺一些(磊哥不做厨师都可惜了),咱们可以给前端工程师提供切实可行的时间格式化方法,实现代码如下。

js 版时间格式化

function dateFORMat(fmt, date) {    let ret;    const opt = {        "Y+": date.getFullYear().toString(),        // 年        "m+": (date.getMonth() + 1).toString(),     // 月        "d+": date.getDate().toString(),            // 日        "H+": date.getHours().toString(),           // 时        "M+": date.getMinutes().toString(),         // 分        "S+": date.getSeconds().toString()          // 秒        // 有其他格式化字符需求可以继续添加,必须转化成字符串    };    for (let k in opt) {        ret = newRegExp("(" + k + ")").exec(fmt);        if (ret) {            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))        };    };    return fmt;}

方法调用:

let date = newDate();dateFormat("YYYY-mm-dd HH:MM:SS", date);>>> 2021-07-2521:45:12

2.SimpleDateFormat格式化

大多数情况下,我们还是需要自力更生,各扫门前雪的,这个时候我们后端程序员就需要发挥自己的特长了,我们提供的第 1 个时间格式化的方法是使用 SimpleDateFormat 来进行时间格式化,它也是 jdk 8 之前重要的时间格式化方法,它的核心实现代码如下:

// 定义时间格式化对象和定义格式化样式SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化时间对象String date = dateFormat.format(new Date())

接下来我们使用 SimpleDateFormat 来实现一下本项目中的时间格式化,它的实现代码如下:

@RequestMapping("/list")public List<UserInfo> getList() {    // 定义时间格式化对象    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    List<UserInfo> list = userMapper.getList();    // 循环执行时间格式化    list.forEach(item -> {        // 使用预留字段 ctime 接收 createtime 格式化的时间(Date->String)        item.setCtime(dateFormat.format(item.getCreatetime()));        item.setUtime(dateFormat.format(item.getUpdatetime()));    });    return list;}

程序执行结果如下:

SpringBoot中如何实现时间格式化

从上述结果可以看出,时间格式化没有任何问题,以及到底我们预想的目的了。但细心的读者会发现,为什么接口的返回字段咋变了呢?(之前的字段是 createtime 现在却是 ctime...)

这是因为使用 #SimpleDateFormat.format 方法之后,它返回的是一个 String 类型的结果,而我们之前的 createtime 和 updatetime 字段都是 Date 类型的,因此它们是不能接收时间格式化得结果的。

所以此时我们就需要在实体类 UserInfo 新增两个字符串类型的“时间”字段,再将之前 Data 类型的时间字段进行隐藏,最终实体类 UserInfo 的实现代码如下:

import com.fasterxml.jackson.annotation.JSONIgnore;import lombok.Data;import java.util.Date;@Datapublicclass UserInfo {    privateint id;    private String username;    @JsonIgnore// 输出结果时隐藏此字段    private Date createtime;    // 时间格式化后的字段    private String ctime;    @JsonIgnore// 输出结果时隐藏此字段    private Date updatetime;    // 时间格式化后的字段    private String utime;}

我们可以使用 @JsonIgnore 注解将字段进行隐藏,隐藏之后的执行结果如下:

SpringBoot中如何实现时间格式化

3.DateTimeFormatter格式化

JDK 8 之后,我们可以使用 DateTimeFormatter 来替代 SimpleDateFormat,因为 SimpleDateFormat 是非线程安全的,而 DateTimeFormatter 是线程安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 来进行时间格式化。

DateTimeFormatter 格式化的代码和 SimpleDateFormat 类似,具体实现如下:

@RequestMapping("/list")public List<UserInfo> getList() {    // 定义时间格式化对象    DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");    List<UserInfo> list = userMapper.getList();    // 循环执行时间格式化    list.forEach(item -> {        // 使用预留字段 ctime 接收 createtime 格式化的时间(Date->String)        item.setCtime(dateFormat.format(item.getCreatetime()));        item.setUtime(dateFormat.format(item.getUpdatetime()));    });    return list;}

执行结果如下所示:

SpringBoot中如何实现时间格式化

DateTimeFormatter 和 SimpleDateFormat 在使用上的区别是 DateTimeFormatter 是用来格式化 JDK 8 提供的时间类型的,如 LocalDateTime,而 SimpleDateFormat 是用来格式化 Date 类型的,所以我们需要对 UserInfoer 实体类做如下的修改:

import com.fasterxml.jackson.annotation.JsonIgnore;import lombok.Data;import java.time.LocalDateTime;@Datapublicclass UserInfo {    privateint id;    private String username;    @JsonIgnore    private LocalDateTime createtime;    private String ctime;    @JsonIgnore    private LocalDateTime updatetime;    private String utime;}

我们可以使用 LocalDateTime 来接收 MySQL 中的 datetime 类型。

4.全局时间格式化

以上两种后端格式化的实现都有一个致命的缺点,它们在进行时间格式化的时候,都需要对核心业务类做一定的修改,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢?

答案是:有的。我们可以不改任何代码,只需要在配置文件中设置一下就可以实现时间格式化的功能了。

首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:

# 格式化全局时间字段
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 指定时间区域类型
spring.jackson.time-zone=GMT+8

这样设置之后,我们将原始的 UserInfo 和 UserController 进行还原。

UserInfo 实现代码如下:

import lombok.Data;import java.util.Date;@Datapublicclass UserInfo {    privateint id;    private String username;    private Date createtime;    private Date updatetime;}

UserController 实现代码:

@RequestMapping("/list")public List<UserInfo> getList() {    return userMapper.getList();}

然后我们运行程序,看到的执行结果如下:

SpringBoot中如何实现时间格式化

从以上结果和代码可以看出,我们只需要在程序中简单配置一下,就可以实现所有时间字段的格式化了。

实现原理分析

为什么在配置文件中设置一下,就可以实现所有时间字段的格式化了呢?

# 格式化全局时间字段
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 指定时间区域类型
spring.jackson.time-zone=GMT+8

这是因为 Controller 在返回数据时,会自动调用 Spring Boot 框架中内置的 JSON 框架 Jackson,对返回的数据进行统一的 JSON 格式化处理,在处理的过程中它会判断配置文件中是否设置了“spring.jackson.date-format=yyyy-MM-dd HH:mm:ss”,如果设置了,那么 Jackson 框架在对时间类型的字段输出时就会执行时间格式化的处理,这样我们就通过配置来实现全局时间字段的格式化功能了。

为什么要指定时间区域类型“spring.jackson.time-zone=GMT+8”呢?

最现实的原因是,如果我们不指定时间区域类型,那么查询出来的时间就会比预期的时间少 8 个小时,这因为我们(中国)所处的时间区域比世界时间少 8 个小时导致的,而当我们设置了时区之后,我们的时间查询才会和预期时间保持一致。

GMT 是什么?

时间区域设置中的“GMT” 是什么意思?

Greenwich Mean Time (GMT) 格林尼治时间,也叫做世界时间。

格林尼治时间

格林尼治是英国伦敦南郊原皇家格林尼治天文台所在地,地球本初子午线的标界处,世界计算时间和经度的起点。以其海事历史、作为本初子午线的标准点、以及格林尼治时间以其命名而闻名于世。这里地势险要,风景秀丽,兼具历史和地方风情,也是伦敦在泰晤士河的东方门户。

不光是天文学家使用格林尼治时间,就是在新闻报刊上也经常出现这个名词。我们知道各地都有各地的地方时间。如果对国际上某一重大事情,用地方时间来记录,就会感到复杂不便.而且将来日子一长容易搞错。因此,天文学家就提出一个大家都能接受且又方便的记录方法,那就是以格林尼治的地方时间为标准。

以本初子午线的平子夜起算的平太阳时。又称格林尼治平时或格林尼治时间。各地的地方平时与世界时之差等于该地的地理经度。1960年以前曾作为基本时间计量系统被广泛应用。由于地球自转速率曾被认为是均匀的,因此在1960年以前,世界时被认为是一种均匀时。由于地球自转速度变化的影响,它不是一种均匀的时间系统,它与原子时或力学时都没有任何理论上的关系,只有通过观测才能对它们进行比较。后来世界时先后被历书时和原子时所取代,但在日常生活、天文导航、大地测量和宇宙飞行等方面仍属必需;同时,世界时反映地球自转速率的变化,是地球自转参数之一,仍为天文学和地球物理学的基本资料。

5.部分时间格式化

某些场景下,我们不需要对全局的时间都进行统一的处理,这种情况我们可以使用注解的方式来实现部分时间字段的格式化。

我们需要在实体类 UserInfo 中添加 @JsonFormat 注解,这样就可以实现时间的格式化功能了,实现代码如下:

import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import java.util.Date;@Datapublicclass UserInfo {    privateint id;    private String username;    // 对 createtime 字段进行格式化处理    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")    private Date createtime;    private Date updatetime;}

修改完代码之后,我们运行项目执行结果如下:

SpringBoot中如何实现时间格式化

从上述结果可以看出,使用注解的方式也可以实现时间的格式化。它的实现原理和第 4 种时间格式化的实现原理类似,都是在返回数据之前,对相应的字段进行时间格式化的处理。

看完了这篇文章,相信你对“SpringBoot中如何实现时间格式化”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: SpringBoot中如何实现时间格式化

本文链接: https://lsjlt.com/news/298814.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot中如何实现时间格式化
    小编给大家分享一下SpringBoot中如何实现时间格式化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!时间问题演示为了方便演示,我写了一个简单 Spring Boot 项目,其中数据库中包含了一张 userinfo 表,...
    99+
    2023-06-20
  • js如何实现时间格式化
    小编给大家分享一下js如何实现时间格式化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!时间格式化界面展示的时间千变万化, 所以一个处理时间的函数,它的重要性就不言...
    99+
    2023-06-27
  • SpringBoot如何利用jackson格式化时间
    这篇文章给大家分享的是有关SpringBoot如何利用jackson格式化时间的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。准备工作创建项目,添加依赖<dependency><groupId&g...
    99+
    2023-06-15
  • js中如何实现日期时间格式化
    这篇文章主要为大家展示了“js中如何实现日期时间格式化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中如何实现日期时间格式化”这篇文章吧。js日期时间格式化将日期时间转换为指定格式,如:YY...
    99+
    2023-06-20
  • SpringBoot如何实现设置全局和局部时间格式化
    本篇内容主要讲解“SpringBoot如何实现设置全局和局部时间格式化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot如何实现设置全局和局部时间格式化”吧!前言在开发中,我们进...
    99+
    2023-07-04
  • vue中如何实现格式化时间过滤器
    这篇文章主要为大家展示了“vue中如何实现格式化时间过滤器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中如何实现格式化时间过滤器”这篇文章吧。具体内容如...
    99+
    2024-04-02
  • Java的API时间格式化如何实现
    这篇文章主要讲解了“Java的API时间格式化如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的API时间格式化如何实现”吧!新API的时间格式化新的时间API的时间格式化由j...
    99+
    2023-07-06
  • Springboot 中怎么格式化全局时间
    这期内容当中小编将会给大家带来有关Springboot 中怎么格式化全局时间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。时间格式化在项目中使用频率是非常高的,当我们的 ...
    99+
    2024-04-02
  • SpringBoot实现设置全局和局部时间格式化
    目录前言解决问题1 全局设置(推荐)2 局部设置(不推荐)总结前言 在开发中,我们进行数据库查询日期类型的时候,往往不是我们想要的时间格式,比如下面的情况: 我数据库里面把这些日期相...
    99+
    2023-01-08
    SpringBoot 全局时间格式化 SpringBoot 局部时间格式化 SpringBoot时间格式化
  • Springboot 全局时间格式化操作
    时间格式化在项目中使用频率是非常高的,当我们的 API 接口返回结果,需要对其中某一个 date 字段属性进行特殊的格式化处理,通常会用到 SimpleDateFormat 工具处理...
    99+
    2024-04-02
  • C#如何实现日期时间的格式化输出
    这篇文章主要讲解了“C#如何实现日期时间的格式化输出”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何实现日期时间的格式化输出”吧!DateTime被放在System命名空间下,在顶级语...
    99+
    2023-07-05
  • Springboot+AOP实现时间参数格式转换
    目录前言场景效果实战自定义注解一 自定义注解二 拦截器工具类使用 接口调用前言 场景 前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就...
    99+
    2024-04-02
  • Android开发中怎么实现格式化时间
    本篇文章给大家分享的是有关Android开发中怎么实现格式化时间,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码实现如下:import Java.text.SimpleDat...
    99+
    2023-05-31
    android roi
  • python 时间戳与格式化时间的转化实现代码
    python 里面与时间有关的模块主要是 time 和 datetime 如果想获取系统当前时间戳:time.time() ,是一个float型的数据 获取系统当前的时间信息 : time.ctime() ...
    99+
    2022-06-04
    时间 代码 python
  • MySQL 格式化时间的实现示例
    目录mysql日期和时间类型DATE格式化TIME格式化DATETIME格式化TIMESTAMP格式化总结MySQL是一个非常流行的关系型数据库管理系统,它提供了一种使用SQL语言来管理和操作数据库的方法。在MySQL中...
    99+
    2023-10-12
    MySQL 格式化时间 MySQL DATE格式化 MySQL TIME格式化
  • php如何实现时间戳转格式
    这篇文章主要介绍php如何实现时间戳转格式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php实现时间戳转格式的方法:1、通过strtotime获取指定日期的unix时间戳;2、使用date函数将指定时间戳转换成系统...
    99+
    2023-06-22
  • php时间格式转换成时间戳如何实现
    这篇文章主要介绍“php时间格式转换成时间戳如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php时间格式转换成时间戳如何实现”文章能帮助大家解决问题。一、什么是时间格式和时间戳在PHP中,时...
    99+
    2023-07-05
  • SpringBoot中时间格式化的五种方法汇总
    目录前言时间问题演示1.前端时间格式化JS 版时间格式化2.SimpleDateFormat格式化3.DateTimeFormatter格式化4.全局时间格式化实现原理分析5.部分时...
    99+
    2024-04-02
  • golang中的时间格式化
    目录golang时间格式化科普 CST 含义GMT 和 UTC 的关系golang 格式化时间 yyyy-MM-dd固定值由来总结golang时间格式化 科普 CST 含义 CST:...
    99+
    2023-02-16
    golang时间格式化 golang格式化 go格式化时间
  • python数据清洗中的时间格式化实现
    目录1.字符串转时间2.时间转字符串3.时间戳相互转换4.python中时间日期格式化符号:1.字符串转时间 from datetime import datetime t = '2...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作