開發中常常涉及到時間與日期,記錄下Java中與時間和日期相關的API
System類提供了一個公共的靜態方法currentTimesMillis()
來返回當前時間距離1970年1月1日0時0分0秒之間以毫秒爲單位的時間差,也叫時間戳。java
@Test public void test1(){ long time = System.currentTimeMillis(); System.out.println(time);// 打印:1572305456261 }
一個類的使用一般須要瞭解如何實例化和使用經常使用的方法。java.util.Date類的實例化主要涉及到兩個構造器無參的構造器和帶參數的構造器,經常使用方法也有兩個toString方法和getTime方法。代碼看下具體的使用:sql
@Test public void test2(){ // 構造器1 Date date1 = new Date(); System.out.println(date1.toString());// Tue Oct 29 07:35:09 CST 2019 System.out.println(date1.getTime());// 1572305836011 // 構造器2 Date date2 = new Date(1572305836011L); System.out.println(date2.toString()); // Tue Oct 29 07:37:16 CST 2019
說明:
關於java.util.Date類須要會使用兩個構造器和兩個方法。數據庫
toString
方法:顯示當前的年,月,日,分,時,秒,時區getTime
方法,獲取當前Data對象對應的時間戳java.sql.Date類是java.util.Date類的子類,主要用於處理數據庫相關的日期格式。這裏,一樣只須要了解怎麼使用便可。
實例化,使用帶參的構造器,參數是一個long型的。安全
@Test public void tese1(){ // java.sql.Date類的使用 java.sql.Date date3 = new java.sql.Date(1572305836011L);// 傳入時間戳 System.out.println(date3.toString());// 2019-10-29 System.out.println(date3.getTime());//1572305836011 // 如何將一個java.sql.Date對象轉化爲java.util.Date對象?多態 // 如何將一個java.util.Date對象轉化爲java.sql.Date對象?共同點:毫秒數 // 方式一: 多態的作法,強轉 Date date4 = new java.sql.Date(1572305836011L); java.sql.Date date5 = (java.sql.Date)date4; // 方式二: Date date6 = new Date(); java.sql.Date date7 = new java.sql.Date(date6.getTime()); System.out.println(date7.toString()); }
Date類的API不易於國際化,大部分被廢棄了,java.text.SimpleDateFormat類是一個不與語言環境有關的方式來格式化和解析日期的具體類。它容許進行 格式化:日期-->文本
、 解析:文本-->日期
。
對於SimpleDateFormat的使用須要掌握兩個點:spa
@Test public void test1() throws ParseException { // 1.實例化:使用默認的構造器 SimpleDateFormat sdf = new SimpleDateFormat(); // 2.建立Date對象 Date date = new Date(); System.out.println(date); // Tue Oct 29 13:42:21 CST 2019 // 3.格式化 String date2 = sdf.format(date); //參數是Date類型的 System.out.println(date2); // 2019/10/29 下午1:43 // 4.解析 String str = "2019/10/29 下午1:43"; Date date3 = sdf.parse(str); System.out.println(date3); //*************************** //使用帶參的構造器 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String s = simpleDateFormat.format(new Date()); System.out.println(s); //解析 String s1 = "2020-10-29 02:02:59"; Date date4 = simpleDateFormat.parse(s1); System.out.println(date4); }
說明:
使用SimpleDateFormat的默認構造器建立出來的對象,去調用format方法進行時間日期的格式化後出來的格式是固定的,而且是2019/10/29 下午1:43
這樣的形式,要解析的字符串也必須以這種格式,不然解析不了。
開發中,經常使用第二種構造器,能夠指定咱們想過要輸出的日期格式。線程
Calendar是一個抽象基類,主用用於完成日期字段之間相互操做的功能。獲取一個Calendar實例的方法以下:code
Calendar.getInstance()
方法GregorianCalendar
的構造器。Calender的常見使用以下:orm
@Test public void test1(){ //1.類的實例化方式:調用Calendar.getInstance方法 Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getClass());// class java.util.GregorianCalendar //2.經常使用方法 //get()方法 int day1 = calendar.get(calendar.DAY_OF_MONTH);// 獲取calender對象是當前月的第幾天 int day2 = calendar.get(calendar.DAY_OF_YEAR);// 獲取當前calender對象是當前年的第幾天 System.out.println(day1); System.out.println(day2); //set()方法 calendar.set(calendar.DAY_OF_MONTH,22); // 將calender對象的DAY_OF_MONTH屬性設置爲22,將原先的屬性改了(可變性) day1 = calendar.get(calendar.DAY_OF_MONTH); System.out.println(day1); //add()方法 calendar.add(calendar.DAY_OF_MONTH,3); // +3天 day1 = calendar.get(calendar.DAY_OF_MONTH); System.out.println(day1); calendar.add(calendar.DAY_OF_MONTH,-3);// -3天 day1 = calendar.get(calendar.DAY_OF_MONTH); System.out.println(day1); //getTime()方法 將日曆類轉換爲Date Date date = calendar.getTime(); System.out.println(date); //Tue Oct 22 13:06:05 CST 2019 //setTime()方法 將Date類轉換爲日曆類 Date date1 = new Date(); // 獲取當前時間的Date calendar.setTime(date1);// 將當前日曆設置爲date1對象對應的時間 day1 = calendar.get(calendar.DAY_OF_MONTH); System.out.println(day1); }
注意:使用Calender
獲取月份時,一月是0,二月是1,以此類推,12月是11
獲取星期時,週日是1,週一是2,以此類推,週六是7對象
爲何要引進新的時間日期API?
JDK 1.0中包含了一個java.util.Date類,可是它的大多數方法已經在JDK 1.1引入Calendar類以後被棄用了。而Calendar並不比Date好多少。它們面臨的問題是:blog
JDK8中引進了新的時間API是java.time
,新的 java.time 中包含了全部關於本地日期(LocalDate)
、本地時間(LocalTime)
、本地日期時間(LocalDateTime)
、時區(ZonedDateTime
)和持續時間(Duration)
的類。歷史悠久的 Date 類新增了 toInstant() 方法,用於把 Date 轉換成新的表示形式。這些新增的本地化時間日期 API 大大簡化了日期時間和本地化的管理。
LocalDate、LocalTime、LocalDateTime 類是其中較重要的幾個類,它們的實例是不可變的對象,分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間信息,也不包含與時區相關的信息。
一樣,使用一個類仍是從如何實例化和有什麼方法使用開始。經常使用方法以下:
示例:
@Test public void test1(){ // now獲取當前的日期、時間、日期+時間 LocalDate localDate = LocalDate.now();// 獲取當前的本地日期 LocalTime localTime = LocalTime.now();// 獲取當前的本地時間 LocalDateTime localDateTime = LocalDateTime.now();// 獲取當前的本地日期和本地時間 System.out.println(localDate); // 2019-10-31 System.out.println(localTime);// 13:35:03.225722700 System.out.println(localDateTime);// 2019-10-31T13:35:03.225722700 // of方法:設置年月日時分秒,沒有偏移量 LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 24, 13, 23, 56); System.out.println(localDateTime1); // 2020-10-24T13:23:56 //getXxx()方法 獲取屬性 System.out.println(localDateTime1.getDayOfMonth());// 24 獲取當前對象對應的日期是這個月的第幾天 System.out.println(localDateTime1.getDayOfWeek());// SATURDAY 獲取當前對象對應的日期是星期幾 System.out.println(localDateTime1.getDayOfYear());// 298 獲取當前天是這一年的第幾天 System.out.println(localDateTime1.getMonth());// OCTOBER 獲取月份 System.out.println(localDateTime1.getSecond());// 56 獲取秒數 // withXxx() 設置相關的屬性(體現不可變性,原先對象的with操做不會改變原來對象的屬性) LocalDateTime localDateTime2 = localDateTime.withHour(4); // 設置小時數爲04 System.out.println(localDateTime); // 2019-10-31T13:41:51.553487900 System.out.println(localDateTime2);// 2019-10-31T04:41:51.553487900 // plusXxx() 加操做 LocalDateTime localDateTime3 = localDateTime.plusDays(5); // 在現有時間加上5天 System.out.println(localDateTime); // 2019-10-31T13:45:29.363506800 System.out.println(localDateTime3);// 2019-11-05T13:45:29.363506800 // minusXxx() 減操做 LocalDateTime localDateTime4 = localDateTime.minusMonths(2); // 在現有時間減去2個月 System.out.println(localDateTime.getMonth()); // OCTOBER System.out.println(localDateTime4.getMonth());// AUGUST }
經常使用仍是LocalDateTime類。
Instant類相似於Date類, java.time包經過值類型Instant提供機器視圖,不提供處理人類意義上的時間單位。Instant表示時間線上的一點,而不須要任何上下文信息,例如,時區。概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC)開始的秒數。由於java.time包是基於納秒計算的,因此Instant的精度能夠達到納秒級。
Instant的實例化和經常使用方法以下:
方法 | 說明 |
---|---|
now() |
靜態方法,返回默認UTC時區的Instant類的對象 |
ofEpochMilli(long EpochMilli) |
靜態方法,返回在1970-01-01 00:00:00基礎上加上指定毫秒數以後的Instant類的對象 |
atOffset(ZoneOffset offset) |
結合即時的偏移來建立一個 OffsetDateTime |
toEpochMilli() |
返回1970-01-01 00:00:00到當前時間的毫秒數,即爲時間戳 |
示例:
@Test public void test2(){ // now():獲取本初子午線當地的標準時間 Instant instant = Instant.now(); System.out.println(instant); // 2019-10-31T06:01:04.921252200Z // 在UTC時區的基礎上加上8個時區(北京時間) OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime); // 2019-10-31T14:01:04.921252200+08:00 // 獲取時間戳 System.out.println(instant.toEpochMilli()); // 1572501664921 // ofEpochMilli():經過給定的時間戳,獲取Instant的實例 Instant instant1 = Instant.ofEpochMilli(1572415933220L); System.out.println(instant1); // 2019-10-30T06:12:13.220Z }
DateTimeFormatter類相似於SimpleDateFormat類,用於格式化與解析日期或時間。java.time.format.DateTimeFormatter
類:該類提供了三種格式化方法:
ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
ofLocalizedDateTime(FormatStyle.LONG)
ofPattern(「yyyy-MM-dd hh:mm:ss」)
,經常使用是這種。方 法 | 描 述 |
---|---|
ofPattern(String pattern) |
靜態方法,返回一個指定字符串格的DateTimeFormatter |
format(TemporalAccessor t) |
格式化一個日期、時間,返回字符串 |
parse(CharSequence text) |
將指定格式的字符序列解析爲一個日期、時間 |
示例以下:
@Test public void testDateTimeFormatter(){ // 實例化方式一 預約義的標準格式。如:`ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME` DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; LocalDateTime localDateTime = LocalDateTime.now(); // 格式化:將日期轉換爲字符串,須要傳入一個TemporalAccessor類型的,而LocalDate、LocalTime和LocalDateTime都是 String str1 = formatter.format(localDateTime); System.out.println(localDateTime); // 2019-10-31T14:16:15.801854 System.out.println(str1); // 2019-10-31T14:16:15.801854 // 使用標準格式的格式化出來結果是:2019-10-31T14:16:15.801854 // 解析:解析的字符串也必須是標準格式的字符創 TemporalAccessor parse = formatter.parse("2020-10-31T14:16:15.801854"); System.out.println(parse); // {},ISO resolved to 2020-10-31T14:16:15.801854 // 實例化方式二:本地化相關的格式 DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);// 使用FormatStyle.SHORT進行格式化 // 格式化 String str2 = formatter1.format(localDateTime); System.out.println(str2); // 格式化後的格式:2019/10/31 下午2:22 // 實例化方式三:自定義格式 DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); // 格式化 String str3 = formatter2.format(LocalDateTime.now()); System.out.println(str3); // 解析 TemporalAccessor parse1 = formatter2.parse("2019-10-31 02:30:29"); System.out.println(parse1); }