Spring boot 中java.util.Date 在json、数据库之间格式的相互转换

首先使用springboot开发网站时,经常会涉及到日期的形式,那么在代码中使用java.util.Date来转化为json格式的字符串,应该怎样转化呢?将Date类型存入数据库有应该怎样实现呢?

Date与json的相互转换 
实现Date转换为json格式,json格式转化为Date的方式总的来说有两种。

1.使用全局配置 
在application.properties配置文件中增加下面两个配置:

#时区设置
spring.jackson.time-zone=GMT+8
日期期时格式设置置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
1
2
3
4
5
这样配置下来的话所有需要与json字符串互转的Date格式都为:yyyy-MM-dd HH:mm:ss。 
下面我们在设置好后测试一下: 
其中测试类DateTest1的代码如下:

package com.JPAdemo.JPAdemo.modle;

import java.util.Date;

/**
 * Created by dell on 2017/8/8.
 */
public class DateTest1 {
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
controller如下:

@GetMapping("/1")
    public DateTest1 test1(){
        DateTest1 dateTest1=new DateTest1();
        dateTest1.setDate(new Date());
        return dateTest1;
    }
1
2
3
4
5
6
运行后使用PostMan测试:

2.使用@Jsonformat、@datetimeformat两个注解局部设置。 
与全局配置相比较,使用这两个注解就更加的精细,只需要在你所需要的地方使用这两个注解即可,并且可以设置不同的时间格式。具体使用见下面的Demo: 
测试类DateTest2:

package com.JPAdemo.JPAdemo.modle;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * Created by dell on 2017/8/8.
 */
public class DateTest2 {
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date date1;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date date2;

    @DateTimeFormat(pattern = "HH:mm:ss")
    @JsonFormat(pattern = "HH:mm:ss")
    private Date date3;

    public DateTest2() {
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public Date getDate3() {
        return date3;
    }

    public void setDate3(Date date3) {
        this.date3 = date3;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
controller:

//测试Date与json格式的相互转换------局部注解
    @GetMapping("/2")
    public DateTest2 test2(){
        DateTest2 dateTest2=new DateTest2();
        dateTest2.setDate1(new Date());
        dateTest2.setDate2(new Date());
        dateTest2.setDate2(new Date());
        return dateTest2;
    }
1
2
3
4
5
6
7
8
9
运行结果: 

其中pattern 的值指定了Date与json字符串相互转化的格式。**当全局设置和局部设置同时使用时,局部设置会失效 
!!! 
** 
- Date在数据库中的存取 
Date在数据库中的存取,我还没有发现全局设置,目前发现只能通过注解@Temporal来实现。 
@Temporal的定义如以下所示:

public @interface Temporal {

    TemporalType value() default TIMESTAMP;

}
1
2
3
4
5
6
从定义可以看出,在使用@Temporal注解时,需要指定枚举类型TemType的值,如果不指定的话默认为TemporalType.TIMESTAMP,一共有三个可选的值:TemporalType.TIME、TemporalType.DATE、TemporalType.TIMESTAMP。具体的使用看下面的Demo: 
DateTest3:

package com.JPAdemo.JPAdemo.modle;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.persistence.*;
import java.util.Date;

/**
 * Created by dell on 2017/8/8.
 */
@Entity
public class DateTest3 {
    @Id
    @GeneratedValue
    private Integer id;

    //存取日期+时间
    @Temporal(TemporalType.TIMESTAMP)
    private Date date1;
    //存取时间
    @Temporal(TemporalType.TIME)
    private Date date2;
    //存取日期
    @Temporal(TemporalType.DATE)
    private Date date3;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public Date getDate3() {
        return date3;
    }

    public void setDate3(Date date3) {
        this.date3 = date3;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
controller:

@Autowired
    DateTest3Repository dateTest3Repository;
    //测试Date在数据库中的存取
    @GetMapping("/3")
    public void test3(){
        DateTest3 dateTest3=new DateTest3();
        dateTest3.setDate1(new Date());
        dateTest3.setDate2(new Date());
        dateTest3.setDate3(new Date());
        dateTest3Repository.save(dateTest3);
    }
1
2
3
4
5
6
7
8
9
10
11
运行结果: 


需要注意的是,TemporalType的三个不同的枚举值对应着数据库中三中不同的时间字段类型,着可以通过在数据库中输入SHOW TABLE 表名 来查看它们分别对应的类型,正因为这些枚举值对应着不同的字段类型,换而言之,当修改其中的枚举值时,对应的表结构也会发生变化,如果你使用的JPA操作数据库的策略是:spring.jpa.hibernate.ddl-auto=update那么必须在修改了TemporalType的值之后删除原先已经创建的表,让JPA在数据库中从新创建表。否则,即使修改了值,根据update的策略,它并不会改变数据库中表中的字段类型,意味着修改无效。 
三种不同的枚举值对应者不同的MySQL中时间类型:

TemporalType.TIME--time、TemporalType.DATE--date、TemporalType.TIMESTAMP--datetime
1
表结构: 

--------------------- 
作者:会吹b的码农 
来源:CSDN 
原文:https://blog.csdn.net/qq_34332387/article/details/76768902 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值