【Java】日期格式化的三种方式

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

一、熟悉的场景

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


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

 

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

  • 16
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值