Date - Java处理日期和时间
生活随笔
收集整理的這篇文章主要介紹了
Date - Java处理日期和时间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在計算機中如何表示日期和時間呢,我們可以想到有幾種表示方式,一種是2016-11-20 8::15:01 GMT+08:00,或者我們用其他的時區,比如GMT+00:00標準時區,或者 America/New_York時區,這種表示方式有什么問題呢,我們先看一下整數在計算機內存中的表示,當我們定義一個整數變量n,123400的時候,計算機其實在內存中分配了4個字節,來存儲這個整數,這4個字節分別是00,0102,08,當我們打印一個整數的時候,我們可以以System.out.println以十進制的形式打印這個整數,結果是一個字符串"123400",我們還可以以16進制的形式打印這個整數,printHex(n),結果是"0x1e208",我們還可以按照貨幣來格式化這個數字,format(n)例如格式化為$符,"$123,400",這里我們要理解數據的存儲和展示,數據的存儲方式就是數據在計算機內存的保存方式,而我們打印出的10進制和16進制,或者是貨幣的形式,就是數據的展示方式,因此我們看到字符串加上時區,表示的日期和時間,他實際上是時間的展示方式,那計算機中應該如何存儲日期和時間呢,在計算機中我們使用Epoch Time存儲日期和時間,Epoch Time是指從1970年1月1日零點以格林威治時區到現在經歷的秒數,例如北京時間2016年11月20號,8點一刻01秒,他的秒數是1479600901而倫敦的2016年11月20號早上0點一刻01秒,他的秒數和本地時間是一樣的,是1479600901,或者我們以毫秒數來表示,就可以在毫秒后面加上單位毫秒數,或者我們以浮點數表示,把毫秒數以小數點后面的表示出來,當我們要使用Epoch Time表示時間的時候,我們實際上存儲的是一個整數,對于Epoch Time 等于1479600901來說,全球各地的任何一個時區,他的當地時間都可以唯一的被確定下來,在Java中實際上是使用一個Long類型的整形來表示毫秒數
我們把這個叫做Epoch Time,有的時候我們也把他叫做時間戳,叫TimeStamp我們再來看一下JAVA提供的API,有兩套API,一套定義在util這個包里面,另一套是新的API,它是在JDK1.8引入的,定義在java.time這個包里,主要包括LocalDate,LocalTime,ZoneDateTime,和Instant這個類,為什么會有兩套新舊API呢,就是歷史遺留的原因,舊的API存在很多問題,所以JAVA8引入了新的API,那我們能不能直接使用舊的API使用新的API呢,現在還不行,因為很多代碼仍然在使用舊的API,所以我們現在仍然需要對舊的API有一定的了解,很多時候我們需要在新舊兩種API之間進行轉換,我們現在看一下java.util.Date這個類他表示的是當前的日期和時間,我們通過new Date()就可以獲取當前的時間,當我們打印一個Date變量的時候,我們得到的是標準的我們還可以通過getTime這個方法,返回一個Epoch的Long類型表示的時間戳當我們需要把java.util.Date轉String的時候,我們直接以toString直接以默認的格式轉換這個Date,我們通過toGMTString和toLocaleString通過默認的格式來表示一個String,如果我們希望以我們希望的方式來格式化一個Date,我們就需要用到SimpleDateFormat這個類我們把String解析為java.util.Date的時候,也需要用到SimpleDateFormat這個類,我們使用預定義的字符串表示格式化的內容例如4個小寫字母yyyy表示年份,兩個大寫字母MM表示月份java.util.Date有幾個問題:1. 首先他不能進行時區的換算2. 其實對于日期和時間的加減非常困難3. 他也不能夠計算兩個日期相差多少天4. 我們也很難計算某個月的第一個星期一是幾號
最后總結一下:1. 我們要理解Epoch Time在JAVA的表示中是一個Long的整形2. JAVA有兩套日期的API,舊的API主要是包括java.util.Date,和Calendar,而新的API在java.time這個包內3. 我們還需要正確的使用java.util.Date,我們要知道在Date和Long之間進行轉換,以及Date和String之間進行轉換通過SimpleDateFormat就可以實現
package com.learn.time;import java.util.Date;/*** 一定要注意import的一定要是java.util.Date* 因為JDK提供了兩個Date* 一個是java.util.Date,一個是java.sql.Date* 我們一定要確保import的是java.util.Date* @author Leon.Sun**/
public class Test {public static void main(String[] args) {/*** 獲取系統當前的時間戳* 首先通過System.getCurrentTimeMillis獲取當前系統的時間戳* 我們可以得到一個long型的整數*/System.out.println(System.currentTimeMillis());/*** 獲取當前時間* 然后我們通過new Date獲取當前的時間* 我們可以直接打印這個Date對象* Fri May 03 11:40:49 CST 2019* 得到的一個GMT格式的日期和時間*/Date now = new Date();System.out.println(now);/*** 把Date轉成long* 然后我們通過getTime方法把Date對象轉成Long類型*/long t = now.getTime();/*** 我們打印這個Long類型*/System.out.println(t);/*** 把Long轉化為Date* 最后我們再把Long類型轉換為Date* 我們只需在創建Date對象的時候傳入一個Long類型的整數就可以了*/System.out.println(new Date(t));}
}
package com.learn.time;import java.util.Date;/*** 我們再來看一下如果把一個Date對象轉為一個String* @author Leon.Sun**/
public class Date2String {public static void main(String[] args) {/*** 獲取當前時間* * 我們首先獲取當前的時間*/Date now = new Date();/*** 以當前時區打印日期時間* * 然后我們調用toString方法* Fri May 03 11:48:08 CST 2019* 它會以當前的時區打印當前的日期和時間*/System.out.println(now.toString());/*** 以GMT+00:00時區打印時間* * 然后我們通過GMT方法,以GMT的標準時區打印出日期和時間* 3 May 2019 03:48:08 GMT* 這個時候我們就會注意到會和北京的時間是不一樣的*/System.out.println(now.toGMTString());/*** 以當前時區+當前Locale打印日期時間* * 我們最后以toLocale來打印當前的時區,* 并且以當前的Locale來打印* May 3, 2019 11:48:08 AM* 這個時候我們就會以Locale為中文的環境來打印*/System.out.println(now.toLocaleString());}
}
package com.learn.time;import java.text.SimpleDateFormat;
import java.util.Date;/*** 我們看一下如何格式化一個Date對象* @author Leon.Sun**/
public class FormatDemo {public static void main(String[] args) {/*** 獲取當前的時間* * 我們同樣先獲取當前的時間*/Date now = new Date();/*** 指定格式打印* * 然后我們通過SimpleDateFormat這個對象來進行格式化* 我們給SimpleDateFormat對象傳入的格式化是4個小寫字母yyyy* 兩個大寫字母MM,兩個小寫字母dd,表示年月日,;兩個大寫字母HH,* 兩個小寫字母mm,和兩個小寫字母ss,表示時分秒,這樣我們打印出來的格式* 就是按照我們預定義的格式打印出來的* * 當我們調整這個順序的時候,打印出來的順序也是不一樣的* 例如我們以MM/dd/yyyy這個格式打印* 05/03/2019 11:54:46* 我們可以發現打印出的結結果是不同的*/// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");/*** 我們還可以給字符串加一個z表示時區* 05/03/2019 11:55:35 CST* 打印出的CST是中國的標準時區* 如果我們把時區改成大寫的Z* 我們再保存執行這個代碼* 05/03/2019 11:57:02 +0800* 打印出的時區是以+0800表示的GMT時區* 那我們怎么獲取JAVA提供了哪些字符呢* 我們可以打開瀏覽器,* 在瀏覽器中搜索JAVA SimpleDateFomrat關鍵字* 然后轉到Oracle的網站* https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html* 我們就可以看到詳細的格式* 我們可以按照文檔的說明選取我們需要的字符進行格式化* * */// SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z");SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss Z");/*** 我們可以看到打印出的格式年月日時分秒* 2019-05-03 11:53:25*/System.out.println(sdf.format(now));}
}
package com.learn.time;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;/*** 如何把一個字符串解析成一個Date對象* @author Leon.Sun**/
public class ParseDemo {public static void main(String[] args) throws Exception {/*** 按系統Locale解析時間* * 我們首先定義了一個字符串表示日期和時間*/String s1 = "2016-11-20 12:15:59";/*** 然后我們傳入預定義的字符串格式;來解析這個字符串* 就可以得到一個Date對象*/Date date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(s1);/*** 我們可以打印一個Date對象* 他的年月日和時分秒* 和我們傳入的字符串是一樣的*/System.out.println(date1);/*** 解析MMM時默認按照系統Locale* * 如果我們要解析Nov這樣的英文單詞,* 我們需要傳入的字符串格式化需要用三個大寫MMM來表示*/String s2 = "Nov/20/2016 12:15:59";/*** 因為我們的系統當前是中文環境,因此我們無法解析到英文的Nov單詞* 要按照英文解析Nov的話,* 我們就需要給SimpleDateFormat傳入一個英文的Locale* 因此我們傳入Locale.US* 就可以正確的解析英文的Nov*/// Date date2 = new SimpleDateFormat("MMM/dd/yyyy HH:mm:ss").parse(s2);Date date2 = new SimpleDateFormat("MMM/dd/yyyy HH:mm:ss",Locale.US).parse(s2);System.out.println(date2);/*** 按ISO 8601標準格式解析* * 最后我們還可以解析ISO的日期和時間* 在這里ISO 8601使用了一個T來分隔日期和時間* 所以我們在構造格式字符串的時候,* 我們需要使用單引號字符串把T給括起來* 就可以正常的解析ISO的日期和時間了* */String iso = "2016-11-20T12:15:59";Date date3 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(iso);System.out.println(date3);}
}
?
總結
以上是生活随笔為你收集整理的Date - Java处理日期和时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日期和时间 - Java处理日期和时间
- 下一篇: LocalDateTime - Java