今天来聊一聊关于时间格式化的问题!
一、熟悉的场景
在期末的课设中,肯定少不了《学生管理系统》、《宿舍管理系统》、《班级管理系统》等等。不要问我是怎么知道的!那么这个时候,创建一个学生类,就成了必不可少的事情了。那么假设我们创建了这么一个学生类
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;
}
@Override
public 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;
}
@Override
public 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 = "输入你要输出的信息(哈哈哈)")
@ResponseBody
public 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;
}
@Override
public String toString() {
return "student{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
在对接口进行调用:
我们就可以看到日期格式直接就格式化成功了。而且我们仍然是将birthday属性的类型写成Date
如果你有兴趣的话,就去试试吧!