今天来聊一聊关于时间格式化的问题!

一、熟悉的场景

在期末的课设中,肯定少不了《学生管理系统》、《宿舍管理系统》、《班级管理系统》等等。不要问我是怎么知道的!那么这个时候,创建一个学生类,就成了必不可少的事情了。那么假设我们创建了这么一个学生类


import java.util.Date;public class student {private String name;private Date birthday;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", birthday=" + birthday +", age=" + age +'}';}public static void main(String[] args) {student stu = new student();stu.setAge(18);stu.setName("阿灿");stu.setBirthday(new Date());System.out.println(stu);}
}

我们看一下输出结果:

显然这个日期格式是我们不想要的。那么我们就有如下的三种日期格式的转化啦!

二、传统的方法(大学里学的)

我们将birthday属性定义为String类型,但是传入一个Date类型的形参,在setter里面我们将这个Date方法进行格式化,并且将格式化的时间赋值给birthday属性。修改部分代码如下:

    private String birthday;public String getBirthday() {return birthday;}public void setBirthday(Date birthday) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = sdf.format(birthday);this.birthday =format;}

同理进行测试

    public static void main(String[] args) {student stu = new student();stu.setAge(18);stu.setName("阿灿");stu.setBirthday(new Date());System.out.println(stu);}

这样子,我们就看到了我们想要的效果。但是这种方法并不推荐!原因很简单!我们在一个setter里面进行了业务的处理,这是很不合理的!! 并且SimpleDateFormat是一个线程不安全的类。

三、直接将birthday改为String类型

我们在这个类里面多添加一个String类型的属性,具体代码如下:

import java.util.Date;public class student {private String name;private Integer age;private String  birthday;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", birthday='" + birthday +"', age=" + age +'}';}}

那么这个时候,我们把直接通过把格式好的时间设置进去,这里我们用另外一种方法。但是值得注意的是DateTimeFormatter是线程安全的。具体代码如下:

 public static void main(String[] args) {student stu = new student();stu.setAge(18);stu.setName("阿灿");// 获取当前时间,并且将他转化为指定格式String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));stu.setBirthday(currentTime);System.out.println(stu);}

这样子,我们就需要自己手动将时间转化为指定格式之后,再setter进去。

四、(扩展)Spring框架中将Date的格式化方案

这里需要事先说明一下,在Spring框架,如果你需要将一个日期格式从后端传递给前端,你可以通过注解@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")进行返回。

具体代码如下:

controller代码:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.support.JstlUtils;import java.util.Date;@Api(tags = "TestController",description = "测试控制类")
@Controller
@RequestMapping("user")
public class TestController {@GetMapping("info")@ApiOperation(value = "输入指定的消息,返回信息", notes = "输出信息")@ApiImplicitParam(name = "desc", required = true, value = "输入你要输出的信息(哈哈哈)")@ResponseBodypublic student info(String desc){student student = new student();student.setBirthday(new Date()); // 直接设置date类型student.setName(desc);return student;}}

student类

package cn.com.sise.swaggerdemo.model;import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;public class student {private String name;private Integer age;@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")private Date  birthday;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +", birthday=" + birthday +'}';}
}

在对接口进行调用:

我们就可以看到日期格式直接就格式化成功了。而且我们仍然是将birthday属性的类型写成Date

如果你有兴趣的话,就去试试吧!

【Java】日期格式化的三种方式相关推荐

  1. JAVA实现多线程的三种方式

    在Java中可通过三种方式来实现多线程: 1.继承Thread类,重写run( )方法 2.实现Runnable接口,重写run( )方法 3.实现Callable接口,重写call( )方法并使用F ...

  2. Java实现数据共享的三种方式

    Java实现数据共享的三种方式 目录 文章目录 1.类的静态变量 2.类内声明共享数据类型的引用 3.内部类 ***后记*** : 内容 1.类的静态变量 示例:老师和学生共用一间教室 Classro ...

  3. java获取时间戳的三种方式比较

    文章目录 java获取时间戳的三种方式比较 java获取时间戳的三种方式比较 import java.util.Calendar; import java.util.Date; //不再推荐使用Dat ...

  4. Java数组定义的三种方式

    Java数组定义的三种方式 第一种:先声明,分配空间,赋值 int[] arr; //先声明arr=new int[10]; //分配空间fo0(int i=0;i<10;i++){arr[i] ...

  5. 时间日期格式化的两种方式

    java中时间格式化的两种方式: 1.使用@JsonFormat注解进行时间日期的格式化 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",t ...

  6. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  7. Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式

    一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...

  8. java base64编码的三种方式

    Java 中如何使用base64编码呢? 有如下三种方式: 方式一:commons-codec.jar Java代码   String base64String = "whuang123&q ...

  9. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  10. Java解析Xml的三种方式总结

    转自:http://blog.csdn.net/zjf280441589/article/details/50613881 XML解析技术有两种 DOM SAX DOM方式  根据XML的层级结构在内 ...

最新文章

  1. Ubuntu 18.04 LTS安装配置驱动、CUDA9.1和Amber18 AmberTools18
  2. Java指令启动jar
  3. 算法------对称二叉树
  4. linux java静默安装软件,linux纯净版脚本执行安装JDK、静默安装Weblogic
  5. cadence -- FPM0.0.8.0生成skill工具集的方法
  6. 20151208_使用windows2012配置weblogic节点管理器
  7. angular路由传递参数_Angular路由——在路由时候传递数据
  8. 软件行业为什么那么多项目经理
  9. web字体设置成平方字体_探索免费和开放的Web字体
  10. (37)FPGA花样流水灯设计(第8天)
  11. python tkinterRadiobutton控件
  12. T分布和T检验的理解,Python代码实现T检验的计算
  13. 煤炭行业网络测试方案——RFC2544测试、网络监测、平台-基站-终端测试、安全测试
  14. C++ printf打印二进制,三进制,八进制,十六进制等
  15. OpenStack 2015年度总结
  16. SylixOS操作系统自学经历(一)
  17. KPM算法详解(Next数组)
  18. 谷歌和百度常见搜索技巧
  19. 3位领导2把椅子,应对类似情况的标准答案
  20. 14. Thymeleaf

热门文章

  1. 【DL BC】矩阵乘积操作简述
  2. CCS软件编译时Relocation Overflow Error报错解决方法
  3. 算法实例(2)_遗传算法
  4. 浅谈手机接收性能的测试
  5. windows 超级终端
  6. 基于LM317的直流稳压电源设计
  7. matlab 一阶惯性环节,一阶惯性环节
  8. SCSI子系统(一)
  9. 程序员必备的8个学习工具
  10. MMD原神动画制作(学习教程一)