1. 程式人生 > >Java8 時間處理類的使用實踐(LocalDate...)

Java8 時間處理類的使用實踐(LocalDate...)

有了它,誰還在用Date?Calendar?

其實也不能這麼絕對,畢竟還沒到那個程度上。Java8 新增了處理時間的一組類(LocalDate、LocalDateTime、LocalTime),剛開始使用時覺得非常費勁,沒有Calendar好用,但是真的使用之後覺得還是比較好用的啊。建議大家以後多多使用。廢話少說,看程式碼~

1、Date與LocalDate的互轉

Date轉LocalDate:

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate 轉 Date:

LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.toInstant(ZoneOffset.UTC))

顯然,LocalDate和Date之間使用了Instant來轉換型別,也可以使用其他的方式來轉換。LocalDate.of()等等,稍微複雜的狠呢!

2、LocalDate的一些時間操作

複製程式碼
 1 DateTimeFormatter ymd = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 2 //字串轉換成LocalDate型別
3 LocalDate ld = LocalDate.parse("2015-11-23", ymd); 4 System.out.println("年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth()); 5 System.ouot.println("從1970年1月1日開始的總天數:"+ld.toEpochDay()); 6 ld = LocalDate.of(2015,11,25); 7 System.out.println("新年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth());
8 9 ld = ld.plusDays(1); 10 System.out.println("加一天年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth()); 11 12 ld = ld.minusDays(2); 13 System.out.println("減兩天年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth()); 14 15 ld = ld.plusMonths(1); 16 System.out.println("加一個月年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth()); 17 18 ld = ld.minusMonths(1); 19 System.out.println("減一個月年月日:"+ld.getYear()+"-"+ld.getMonthValue()+"-"+ld.getDayOfMonth()); 20 21 ld.plusWeeks(1);//加一星期 22 ld.plusYears(1);//加一年 23 ld.minusWeeks(1);//減一星期 24 ld.minusYears(1);//減一年
複製程式碼

強大到我們不用去手工的計算這些東西,省事,省力,靈活性很強。

3、部分框架的支援

因為專案是Spring4+MyBatis3的,所以我只測試了這兩個框架對它的支援性。

(1)Spring4 是支援LocalDate的。在spring mvc接收引數時做下格式轉換:

1 @RequestMapping("/test")
2 public void method(HttpServletRequest request,HttpServletResponse response,
3 @DateTimeFormat(pattern="yyyy-MM-dd") LocalDate localDate){
4 //接收處理邏輯
5 }

對於Spring MVC的接收引數還需要說明:如果是傳入的Date型別,也需要使用註解@DateTimeFormat進行格式化,不然會報400引數錯誤。如果是bean物件,而且含有Date或者LocalDate型別欄位,也需要添加註解@DateTimeFormat。

(2)MyBatis3 對LocalDate的支援。現階段還是不支援的,需要我們做些處理。

方案一、修改MyBatis包原始碼。不到迫不得已的情況下,是不會嘗試的。

方案二、增加一個Handler處理型別轉換。網上找到的處理方案,親試,完全可以。

此處只介紹方案二,大牛可以去嘗試下方案一。

第一步:建立轉換器

複製程式碼
 1 package com.hfms.mybatis.type;
 2  
 3 import java.sql.CallableStatement;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Timestamp;
 8 import java.time.LocalDateTime;
 9 
10 import org.apache.ibatis.type.BaseTypeHandler;
11 import org.apache.ibatis.type.JdbcType;
12 import org.apache.ibatis.type.MappedTypes;
13  /**
14   *型別轉換器,以LocalDateTime為例,使用LocalDate需做相應修改
15   *
16   **/
17 @MappedTypes(LocalDateTime.class)
18 public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
19  
20     @Override
21     public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
22         ps.setTimestamp(i, Timestamp.valueOf(parameter));
23     }
24  
25     @Override
26     public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
27         Timestamp date = rs.getTimestamp(columnName);
28         if (date == null) {
29             return null;
30         } else {
31             return date.toLocalDateTime();
32         }
33     }
34  
35     @Override
36     public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
37         Timestamp date = rs.getTimestamp(columnIndex);
38         if (date == null) {
39             return null;
40         } else {
41             return date.toLocalDateTime();
42         }
43     }
44  
45     @Override
46     public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
47         Timestamp date = cs.getTimestamp(columnIndex);
48         if (date == null) {
49             return null;
50         } else {
51             return date.toLocalDateTime();
52         }
53     }
54 }
複製程式碼

第二步:在mybatis-config.xml中配置

1 <typeHandlers>
2     <package name="com.hfms.mybatis.type"/>
3 </typeHandlers>

第三步:建立物件的時候使用:

1 public class Test{
2   LocalDateTime localDateTime;   
3 }

這樣在TestHandler.xml中就可以直接使用了。

轉自:http://www.cnblogs.com/quanenmin/p/4993929.html

相關推薦

Java8 時間處理的使用實踐LocalDate...

有了它,誰還在用Date?Calendar?其實也不能這麼絕對,畢竟還沒到那個程度上。Java8 新增了處理時間的一組類(LocalDate、LocalDateTime、LocalTime),剛開始使用時覺得非常費勁,沒有Calendar好用,但是真的使用之後覺得還是比較好用的啊。建議大家以後多多使用。廢話少

JAVA進階時間處理

前言       前面學些了可變字元序列StringBuilder以及StringBuffer類,本章將繼續學習常用類事件處理類 範例 1.時間的概念 在java中,我們用long型別資料表示每一個時刻的時間,單位為毫秒,以1970年1月1日 00:00:00為基點進

python 3 之日期與時間處理模塊date和datetime

python 時間 處理模塊 前言相關術語的解釋時間的表現形式time模塊datetime模塊時間格式碼總結前言 在開發工作中,我們經常需要用到日期與時間,如: 作為日誌信息的內容輸出計算某個功能的執行時間用日期命名一個日誌文件的名稱記錄或展示某文章的發布或修改時間其他Python中提供了多個用於

機器學習實踐—sklearn之特徵預處理

一、特徵預處理概述 什麼是特徵預處理 # scikit-learn的解釋 provides several common utility functions and transformer classes to change raw feature vectors into

框架綜合實踐7--批量處理命令命令執行指令碼

目的 自動化指令碼開發階段,我們會使用工具pycharm IDE來編輯執行指令碼,但是指令碼開發完成後,每次執行指令碼都要開啟工具就會變得很麻煩,而且pycharm IDE比較消耗資源,影響執行效率,這種情況下,我們可以使用cmd命令或者將cmd命令封裝為bat批處理指令碼來執行。 裝置連線

《離散時間訊號處理學習筆記》—連續時間訊號的取樣

注:本部落格是基於奧本海姆《離散時間訊號處理》第三版編寫,主要是為了自己學習的複習與加深。 一、週期取樣 1、訊號的離散表示可以由多種形式,包括各種型別的基展開,訊號建模的引數模型和非均勻取樣。這些各種型別的表示方法通常都始於通過週期取樣得到的聯絡時間訊號的離散時

模型處理實踐1——simplygon下載與安裝

一、simplygon 1.Simplygon介紹 1.1 簡介 Simplygon是一個平臺,利用它可對模型和紋理之類的 3D 素材進行不同目的的優化,無需手動操作(或僅需少量操作)。可使用 Simplygon 建立 LOD 鏈、減少繪製呼叫、將多個高精度模型

演算法實踐——層次聚、K-means聚

因為百度雲的文章裡面有些圖片丟失了,想起這篇東西之前被一箇中國統計網轉發過,所以自己搜了一下想直接把圖搞回來,結果發現到處轉載的也有不少,自己現在發倒好像是抄襲似的。其實這篇文章裡面特別有價值的東西不算太多,PCCA算是一個知道的人不多而且也挺有意義的演算法,譜

演算法實踐——演算法總結

  前面的文章裡總共提到了7種聚類演算法,我們就會情不自禁地想知道,哪一種是“最好”的聚類演算法?   正如我在一開始就提到,聚類實際上是由使用者來給定規則,從而實現分類的。所以所謂“最好”的聚類演算法,就應該是那個聚類規則“最能反映系統特徵”的演算法(當然,

C#中子對父中虛方法的處理有重寫override和覆蓋new,他們有什麼區別?

在子類中用override重寫父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法; 如果子類中用new覆蓋父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法; 示例程式碼: /// <

log4j2如何根據配置的配置檔案選取配置檔案處理ConfigurationFactory原始碼分析

一、環境 log4j-core-2.2.jar 二、背景知識 我們知道log4j2(2.2版本)支援的配置檔案型別有以下幾種: XML、JSON、YAML 當然配置的實現由多種方式:官方文件中有介紹 Configuration of Log4j 2 can be acc

.NET中異常處理的最佳實踐

本文翻譯自CodeProject上的一篇文章,原文地址。目錄介紹做最壞的打算提前檢查不要信任外部資料可信任的裝置:攝像頭、滑鼠以及鍵盤 “寫操作”同樣可能失效安全程式設計不要丟擲“new Exception()”不要將重要的異常資訊儲存在Message屬性中每個執行緒要包含一個try/catch塊捕獲異常後要

java8 時間處理 LocalDate LocalTime LocalDateTime 及毫秒轉換

LocalDate 各種和日期的操作,以天為最小單位,支援 日,月,年,星期的增加和減少,計算方便,格式化靈活。沒有時分秒。LocalTime 沒有日期,只是時間,就是時分秒,毫秒,可以選擇不用毫秒,可以進行相應的加減計算。LocalDateTime 完整時間,年月日,時分秒

文字處理——基於 word2vec 和 CNN 的文字分類 :綜述 & 實踐

導語傳統的向量空間模型(VSM)假設特徵項之間相互獨立,這與實際情況是不相符的,為了解決這個問題,可以採用文字的分散式表示方式(例如 word embedding形式),通過文字的分散式表示,把文字表示成類似影象和語音的連續、稠密的資料。這樣我們就可以把深度學習方法遷移到文字

《離散時間訊號處理學習筆記》—離散時間訊號與系統

注:本部落格是基於奧本海姆《離散時間訊號處理》第三版編寫,主要是為了自己學習的複習與加深。 1、在訊號的數學表示式中,獨立變數可以是連續的,也可以是離散的。 1)、連續時間訊號時定義在一個連續時間域上,可用一個連續獨立變數來表示。連續時間訊號常常又稱作模擬訊號。

C#進階系列——WebApi 異常處理解決方案

機制 輸出 ges 如果 但是 rom lba slist 解決 出處:http://www.cnblogs.com/landeanfen/p/5363846.html 閱讀目錄 一、使用異常篩選器捕獲所有異常 二、HttpResponseException自

走進windows編程的世界-----消息處理函數4

rpo 擴展 hinstance adding 3.1 eof client cnblogs set 一 右鍵菜單 1 右鍵菜單 當在窗體點擊鼠標右鍵時,彈出的菜單。 2 右鍵菜單的使用 2.1 創建菜單 CreatePopupMenu 2

Android自己定義組件系列【6】——進階實踐3

err ack XML @+ layout apk get ast edi 上一篇《Android自己定義組件系列【5】——進階實踐(2)》繼續對任老師的《可下拉的PinnedHeaderExpandableListView的實現》進行了分析,這一篇計劃中間插一段“知識點

MySQL 日期時間函數大全

1.0 intern each time() localtime 根據 with star 部分函數 轉載自:http://blog.itpub.net/29773961/viewspace-1808967 以下內容基於MySQL 5.6及更高,大部分函數5.5也基

API開發實踐 返回HTML

acea 指定 win filename static box 拖動地圖 ive let 分為兩個部分:生成HTML和返回HTML 生成HTML: 最終想要的時顯示地圖,不可避免的使用高德地圖的API。 【地圖API】地址錄入時如何獲得準確的經緯度?淘寶收貨地址詳解 改變幾