時間和日期處理是在日常開發(fā)工作中比較重要的一個處理操作,在應(yīng)用程序中,對于時間和日期的處理涉及到了程序處理的各個方面的內(nèi)容,包括了對于數(shù)據(jù)庫中的時間日期的存儲、如何接受接口中傳入的時間日期參數(shù)、如何對時間日期進行格式化或者是對時間日期等操作進行解析等。而Spring Boot中提供了各種時間日期處理支持,結(jié)合Java8中的各種時間日期類以及在Spring框架底層提供的對于時間日期處理的操作可以為開發(fā)者提供有效的時間日期處理操作。
下面我們就詳細的介紹一下在Spring Boot中對于日期時間操作的方式。
Spring Boot中日期時間類型的基礎(chǔ)支持
Spring Boot框架底層是通過Spring框架實現(xiàn)的,所以它其中提供的很多的日期時間格式化的機制主要還是來源于Spring框架對其的支持,在Spring中默認是用java.time包中的類來實現(xiàn)對于時間日期的處理。而在Java8中引入了很多的新的時間處理類來支持對時間日期的處理。如下所示,是在Spring Boot中能夠支持的時間類型。
在中可以通過默認的Jackson庫來對日期時間進行序列化和反序列化操作,只要對象中的時間類型是、等類型,那么就會默認通過JSON進行時間格式的處理。
常用的日期時間類型及其使用
主要是用來表示沒有時間的日期的處理,例如2024年11月14日。它只包含年、月、日,而不會包含具體的時分秒,如下所示。
public class User {
private String name;
private LocalDate birthDate;
// Getters and Setters
}
主要是表示時間中沒有日期的部分,也就是例如12:30:45。它只包含時、分、秒。而不會出現(xiàn)日期信息,如下所示。
public class Event {
private String name;
private LocalTime startTime;
// Getters and Setters
}
是在日常開發(fā)中比較常用的日期時間類型它包含了日期和時間的值,但是不帶時區(qū)。例如2024年11月14日 15:30:00。既包含了日期也包含了時間。
public class Meeting {
private String title;
private LocalDateTime meetingTime;
// Getters and Setters
}
不僅包含日期和時間,還包含時區(qū)信息。適用于需要跨時區(qū)操作的應(yīng)用。
public class Flight {
private String flightNumber;
private ZonedDateTime departureTime;
// Getters and Setters
}
日期時間的格式化與解析
在Spring Boot中默認提供了基于JSON格式的日期時間處理功能,例如默認情況下時間日期格式會被序列化為ISO-8601格式,如下所示。
{
"birthDate": "2024-11-14",
"startTime": "12:30:45",
"meetingTime": "2024-11-14T15:30:00",
"departureTime": "2024-11-14T15:30:00+01:00"
}
如果需要對其時間日期進行自定義的格式化操作,我們可以通過在Spring Boot配置文件中添加對應(yīng)的時間格式來進行格式化操作,如下所示。
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
上面這種方式會對所有的日期時間都進行同樣的格式化。如果想要都對于某個對象中的某個屬性進行指定格式的序列化,我們可以通過通過注解或者@來實現(xiàn)。
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
// Getters and Setters
}
這樣,字段就會按指定的格式進行序列化和反序列化。
與數(shù)據(jù)庫的交互(JPA/)
在Spring Boot中,比較常用的數(shù)據(jù)庫交互方式有JPA、MyBatis等,下面我們介紹一下通過JPA的方式來進行數(shù)據(jù)庫的時間交互,在JPA中默認支持的是java.time包中的日期時間類型,也就是說在實體類中可以通過、、等類型來定義時間操作,如下所示。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(name = "birth_date")
private LocalDate birthDate;
@Column(name = "created_at")
private LocalDateTime createdAt;
// Getters and Setters
}
在JPA操作的時候,會自動將映射為SQL中的DATE類型,將映射為類型。如果使用的是類型,也會被映射為 WITH TIME ZONE類型,當然在MyBatis中提供的是直接的類型轉(zhuǎn)換配置,有興趣的讀者可以自己研究一下,這里不做過多的介紹。
配置日期時間格式
在進行數(shù)據(jù)獲取的時候,如果希望對JPA查詢中日期時間的格式化進行控制,可以使用@注解來指定日期時間的類型。這里需要注意對于和不需要通過@注解來指定,如果使用的是Date類型那么還是需要通過@來指定,如下所示。
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
日期時間的時區(qū)處理
時區(qū)是處理日期時間時的一個常見問題,在Spring Boot中提供了內(nèi)置的日期時區(qū)的處理機制,我們可以通過如下的配置來設(shè)置全局的時區(qū)處理機制。
# 設(shè)置JVM默認時區(qū)
spring.jackson.time-zone=Asia/Shanghai
當然除了上面的這種方式,我們還可以通過類來進行一些特殊的時間時區(qū)處理,所以在實際開發(fā)中如果用到了跨時區(qū)的數(shù)據(jù),那么這里我們推薦使用的方式就是而不是,如下所示。
public class Event {
private String name;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private ZonedDateTime startTime;
// Getters and Setters
}
如果需要進行時區(qū)的轉(zhuǎn)換操作,我們可以通過的()方法來實現(xiàn),如下所示。
ZonedDateTime dateTimeInUtc = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime dateTimeInNewYork = dateTimeInUtc.withZoneSameInstant(ZoneId.of("America/New_York"));
Spring Boot中的國際化與本地化支持
除了上面的操作之外,對于一些國際化的應(yīng)用,中還提供了本地化的時間支持奧做配置,應(yīng)用可以通過不同的語言和地區(qū)的要求來對時間日期進行格式化操作,我們可以通過在配置文件中添加如下的配置來實現(xiàn)相關(guān)的操作。
spring.mvc.locale=zh_CN
spring.mvc.locale-resolver=accept-header
這樣Spring Boot中會根據(jù)請求中的Accept-頭來決定日期時間的顯示格式。例如如果其中是zh_CN會顯示yyyy年MM月dd日格式,而en_US則會使用MM/dd/yyyy格式。
總結(jié)
在Spring Boot應(yīng)用中,對于時間日期的處理還是一個比較重要的操作,無論是在HTTP請求中還是在與數(shù)據(jù)庫交互的過程中都需要對時間進行格式化的解析和處理,在中提供了很多豐富的簡單的時間格式化處理操作,開發(fā)者可以利用這些操作快速的實現(xiàn)各種日期時間的格式化操作。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。