JDK8 日期格式化

SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程

为什么要用新的日期类型

在 JDK8 中,一个新的重要特性就是引入了全新的时间和日期API,它被收录在 java.time 包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。

在 JDK8 之前,所有关于时间和日期的API存在以下几个缺陷,也正是这些缺陷,出现了很多第三方的日期处理框架,例如 Joda-Timedate4j等开源项目。但是,Java 需要一套标准的用于处理时间和日期的框架,于是乎在 JDK8 中引入了新的日期API。遵循 JSR-310 规范的实现,而 Joda-Time 框架的作者正是 JSR-310 的规范的倡导者,所以用过 Joda-Time 的对新日期API也不会陌生。

缺陷

  • 之前的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,且非线程安全的;
  • 日期格式化类 java.text.DateFormat 是一个抽象类,使用时需要先实例化一个 SimpleDateFormat 对象来处理日期格式化,同时 DateFormat 也不是线程安全的,这意味着如果你在多线程程序中调用同一个 DateFormat 对象,会得到意想不到的结果。
  • 对日期的计算方式繁琐,而且容易出错,因为月份是从0开始的,从 Calendar 中获取的月份需要加一才能表示当前月份。

为什么要格式化

说了这么多,和 Spring Boot 有什么关系呢?不要急,待我娓娓道来!

  • 格式化前:{“payTime”:”2018-09-30T09:51:56.77”}
  • 格式化后:{“payTime”:”2018-09-30 09:51:56”}

都知道我们国人习惯 yyyy-MM-dd HH:mm:ss 这种格式的日期,但奈何框架是歪国大佬们写的,他们的日期格式与我们相差甚远,好在 Spring Boot 提供了 spring.jackson.date-format,奈何它只能格式化 java.util.Date。那么解决办法是什么呢?

导入依赖

首先一个 WEB 项目,必不可少的依赖就是 spring-boot-starter-web 了,一路学习下来的小伙伴们肯定都熟记于心了

1234
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>

配置文件

由于 spring.jackson.date-format 对新的日期类型不在有效果,所以这里0配置文件了

方案一(强烈推荐)

只需要定义一个配置类,在里面定义两个 Bean 即可完成全局日期格式化处理,这种方式也是本人现在使用的,同时还兼顾了 Date 和 LocalDateTime 并存

12345678910111213141516171819202122232425262728293031
package com.battcn.config;

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;

import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;

/** * @author Levin * @since 2018/9/30 0030 */@Configurationpublic class LocalDateTimeSerializerConfig {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")    private String pattern;

    @Bean    public LocalDateTimeSerializer localDateTimeDeserializer() {        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));    }

    @Bean    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {        return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());    }}

方案二(强烈推荐)

有时候,我们对日期格式要做特殊的处理,全局的格式化方式无法满足我们需求是,使用该方案是非常好的选择,通过 @JsonFormat 注解我们可以更为精准的为日期字段格式化,它也是优先级最高的

123456
public class Order {

    @JsonFormat(pattern = "yyyy-MM-dd")    private LocalDateTime payTime;    // 省略 GET SET ...}

方案三(可选)

其实和第一种类似,只不过第一种的写法更加优雅简洁,如果有多种类型需要做统一格式化处理,这种方案也不是不可以考虑

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
package com.battcn.config;

import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.databind.*;import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;

import java.io.IOException;import java.time.LocalDate;import java.time.LocalDateTime;

import static java.time.format.DateTimeFormatter.ofPattern;

/** * @author Levin * @since 2018/9/30 0030 */@Configurationpublic class LocalDateTimeSerializerConfig1 {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")    private String pattern;

    @Bean    @Primary    public ObjectMapper serializingObjectMapper() {        ObjectMapper objectMapper = new ObjectMapper();        JavaTimeModule javaTimeModule = new JavaTimeModule();        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());        objectMapper.registerModule(javaTimeModule);        return objectMapper;    }

    public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {        @Override        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {            gen.writeString(value.format(ofPattern(pattern)));        }    }

    public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {        @Override        public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException {            return LocalDateTime.parse(p.getValueAsString(), ofPattern(pattern));        }    }}

控制层

定义了一个很简单的响应

123456789101112131415161718192021222324
package com.battcn.controller;

import com.battcn.pojo.Order;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

/** * @author Levin * @since 2018/8/2 0002 */@RestController@RequestMapping("/orders")public class OrderController {

    @GetMapping    public Order query() {        Order order = new Order();        order.setPayTime(LocalDateTime.now());        return order;    }}

主函数

123456789101112131415
package com.battcn;

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;

/** * @author Levin */@SpringBootApplicationpublic class Chapter28Application {

    public static void main(String[] args) {        SpringApplication.run(Chapter28Application.class, args);    }}

测试

完成准备事项后,启动Chapter28Application,访问 http://localhost:8080/orders 即可看到格式化后的日期啦…

原文地址:https://www.cnblogs.com/lywJ/p/10715381.html

时间: 2024-10-12 11:30:48

JDK8 日期格式化的相关文章

thymeleaf中的日期格式化

本篇介绍些thymeleaf中的日期格式化的方法: 1.用#dates.format来解决: <span th:text="${#dates.format(user.date, 'yyyy-MM-dd')}">4564546</span> 或者<span th:text="${#dates.format(billingForm.startTime,'yyyy-MM-dd HH:mm:ss')}">4564546</span&

js输出日期格式化

//日期格式化 Date.prototype.Format = function(fmt) { var o = { "M+" : this.getMonth() + 1, "d+" : this.getDate(), "h+" : this.getHours(), "m+" : this.getMinutes(), "s+" : this.getSeconds(), "q+" : Mat

161226、js日期格式化

JavaScript Date format(js日期格式化) 方法一:// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) // 例子: // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09

Asp 日期格式化问题 沙比作者,我改过来。

Asp 日期格式化问题 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2009-06-14我要评论 asp做网站经常遇到日期格式处理问题,介绍一个有用的vbscript函数formatdatetime() 对于access数据库的日期时间类型字段存储的日期,直接从数据库中读出显示的效果是带时间的如,2009-06-13 18:00 ,如果只是希望显示日期应该怎么办呢? Vbscrip有一个函数FormatDateTime().其说明如下: 返回表达式,此表达式已被格式化为日期或

JS日期对象扩展-日期格式化

日期对象扩展(日期格式化)yyyy-MM-dd hh:mm:ss.S Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth()+1, //月份 "d+" : this.getDate(), //日 "h+" : this.getHours(), //小时 "m+" : this.getMinutes(), //分 "s+"

Js获取当前日期时间+日期印证+判断闰年+日期的天数差+日期格式化+JS判断某年某月有多少天

Js获取当前日期时间+日期验证+判断闰年+日期的天数差+日期格式化+JS判断某年某月有多少天 字符串转日期型+Js当前日期时间+日期验证+判断闰年+日期的天数差+日期格式化+日期所在年的第几周 日期时间脚本库方法列表Date.prototype.isLeapYear 判断闰年Date.prototype.Format 日期格式化Date.prototype.DateAdd 日期计算Date.prototype.DateDiff 比较日期差Date.prototype.toString 日期转字符

MVC日期格式化的2种方式

原文:MVC日期格式化的2种方式 假设有这样的一个类,包含DateTime类型属性,在编辑的时候,如何使JoinTime显示成我们期望的格式呢? using System; using System.ComponentModel.DataAnnotations; namespace MvcApplication1.Models { public class Employee { public DateTime? JoinTime { get; set; } } } 在HomeController

sql日期格式化

0   或   100   (*)     默认值   mon   dd   yyyy   hh:miAM(或   PM)       1   101   美国   mm/dd/yyyy       2   102   ANSI   yy.mm.dd       3   103   英国/法国   dd/mm/yy       4   104   德国   dd.mm.yy       5   105   意大利   dd-mm-yy       6   106   -   dd   mon  

JSP中利用JSTL标签对日期格式化

数据库:Mysql 开发语言:JAVA 页面类型:JSP 对Mysql中的日期类型格式化,在JSP中,如何办呢,很多人说在JAVA后台去日期格式化,无奈了,于是找到了比较靠谱的答案 需要先引入JSTL库 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 其次对JSP输出的日期进行格式化 <span>发布时间:<fmt:formatDate value=&qu