文章目錄
-
- 介紹
- 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

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
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);
}
}
注意: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