天天看點

Java8輕松地解決各種日期和時間問題

文章目錄

    • 介紹
    • LocalDate的使用
    • LocalTime的使用
    • JDBC中日期類型的映射
    • 代碼實作
    • 格式轉換

介紹

Java中新增了日期處理類——LocalDate,它是一種高效的日期類,比起Date的複雜具有相當高的簡潔性,主要有三種:

java.time.LocalDate ->隻對年月日做出處理

java.time.LocalTime ->隻對時分秒納秒做出處理

java.time.LocalDateTime ->同時可以處理年月日和時分秒

LocalDate的使用

首先通過代碼看看LocalDate類的使用:

// 取目前日期:
            LocalDate today = LocalDate.now(); // -> 2014-12-24
            // 根據年月日取日期,12月就是12:
            LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
            // 根據字元串取:
            LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 按照yyyy-MM-dd驗證,02寫成2都不行
            LocalDate.parse("2014-02-29"); // 無效日期無法通過:抛出DateTimeParseException: Invalid date
            int dayofMonth = today.getDayOfMonth();
			// 今天是周幾(**傳回的是個枚舉類型,需要再getValue()**)
			int dayofWeek = today.getDayOfWeek().getValue();
			// 今年是哪一年
			int dayofYear = today.getDayOfYear();

           

通過上面這幾個方法可以友善得到和構造符合yyyy-MM-dd标準的日期,在實際開發中還會頻繁進行日期的類型轉換和與資料庫的互動,是以再展示其更強大的地方,使用TemporalAdjusters 類對日期進行修改

// 取本月第1天:
		LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2018-04-01
		// 取本月第2天:
		LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2018-04-02
		// 取本月最後一天,再也不用計算是28,29,30還是31:
		LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2018-04-30
		// 取下一天:
		LocalDate firstDayOfNextMonth = lastDayOfThisMonth.plusDays(1); // 變成了2018-05-01
		// 取2017年1月第一個周一:
		LocalDate firstMondayOf2019 = LocalDate.parse("2019-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2019-01-07 

           

是不是很友善,比如取本月最後一天時根本無需判斷是哪一月,它已經幫你實作了。放幾個常用的API

Java8輕松地解決各種日期和時間問題

LocalTime的使用

LocalTime隻包含時間,以前用java.util.Date怎麼才能隻表示時間呢?答案是,假裝忽略日期。

//LocalTime包含毫秒:
LocalTime now = LocalTime.now(); // 11:09:09.240
//清除毫秒數:
LocalTime now = LocalTime.now().withNano(0)); // 11:09:09
//構造時間:
LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00
           

時間也是按照ISO格式識别,但可以識别以下3種格式:

12:00

12:01:02

12:01:02.345

同樣,放一些常用API

Java8輕松地解決各種日期和時間問題

JDBC中日期類型的映射

date -> LocalDate

time -> LocalTime

timestamp -> LocalDateTime

代碼實作

寫個小例子實作以下插入各種類型的時間

package com.bm.db;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class DateTest {

	public static void main(String[] args) {
	
		// String datetime = 2018-04-30
		// TODO Auto-generated method stub
		String sql="insert into time(info,timestamp,date,time,datetime) values ('dabai','"+LocalDateTime.now()+"','"
					+LocalDate.now()+"','"+LocalTime.now()+"','"+LocalDateTime.now().withNano(0)+
					"')";
		int i =mysqlUtil.update(sql);
	}

}
           
Java8輕松地解決各種日期和時間問題

注意:timestamp會在你每次修改此條記錄後自動根據系統時間修改。是以timestamp适合記錄最後更改的時間,datetime适合記錄開始的時間,timestamp有效時間1970-01-01 00:00:00 到 2037年,超過的自動置0.而datetime有效時間’1000-01-01 00:00:00’到’9999-12-31 23:59:59’.

另外,使用timestamp會伴随時區問題,暫時沒遇到,以後再解決。

下面是另外一個很常見的問題。

格式轉換

說到轉換格式,有SimpleDateFormat和DateFormat,但是它們兩者都是線程不安全的!啥情況下會有這樣的問題呢?如果我們為了實作日期轉換這樣的工具,每次都new一個對象,但是用完了就不用了,就造成了浪費,為此我們會将它寫成單例的,但是單例的同時,一個對象供多個線程使用的時候,就會出現線程安全的問題。這個時候就需要這個新的jdk8出的DateTimeformatter這個類。

字元串->類

寫在前面。如果是很工整的格式,yyyy-MM-dd 這種日期格式字元串,直接用LocalDate.parse()進行轉換就行了,相對應的時間也是。既有時間又有日期的用DateTimeformatte這個類就行。

String time = "1997-01-31 18:39:20";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime =LocalDateTime.from(formatter.parse(time));
String time = "1997-01-31 18:39:20";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(time,formatter);
           

類->字元串

如果是LocalDate這種标準格式的,直接toString就可以了,-

如果是LocalTime這種格式的,toString會附帶納秒值21:06:30.760163,

這個時候你可以使用日期格式器,或者這樣

LocalTime time1 = LocalTime.now().withNano(0),把納秒直接清0.

如果是LocalDateTime,這個時候是需要一個日期轉換器的。才能由時間+日期->想要的時間,

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime nowTime = LocalDateTime.now();
String result = nowTime.format(formatter);
           

到這吧。

參考:https://blog.csdn.net/qq_41376740/article/details/81292504

繼續閱讀