JDK 8以前日期時間API
1.獲取系統當前時間:System類中的currentTimeMillis()
long time = System.currentTimeMillis();
//返回當前時間與1970年1月1日0時0分0秒之間以毫秒爲單位的時間差。
//稱爲時間戳
System.out.println(time);java
2. java.util.Date類與java.sql.Date類sql
/* java.util.Date類 |---java.sql.Date類 1.兩個構造器的使用 >構造器一:Date():建立一個對應當前時間的Date對象 >構造器二:建立指定毫秒數的Date對象 2.兩個方法的使用 >toString():顯示當前的年、月、日、時、分、秒 >getTime():獲取當前Date對象對應的毫秒數。(時間戳) 3. java.sql.Date對應着數據庫中的日期類型的變量 >如何實例化 >如何將java.util.Date對象轉換爲java.sql.Date對象 */ @Test public void test2(){ //構造器一:Date():建立一個對應當前時間的Date對象 Date date1 = new Date(); System.out.println(date1.toString());//Sat Feb 16 16:35:31 GMT+08:00 2019 System.out.println(date1.getTime());//1550306204104 //構造器二:建立指定毫秒數的Date對象 Date date2 = new Date(155030620410L); System.out.println(date2.toString()); //建立java.sql.Date對象 java.sql.Date date3 = new java.sql.Date(35235325345L); System.out.println(date3);//1971-02-13 //如何將java.util.Date對象轉換爲java.sql.Date對象 //狀況一: // Date date4 = new java.sql.Date(2343243242323L); // java.sql.Date date5 = (java.sql.Date) date4; //狀況二: Date date6 = new Date(); java.sql.Date date7 = new java.sql.Date(date6.getTime()); }
3. java.text.SimpleDataFormat類
SimpleDateFormat對日期Date類的格式化和解析
1.兩個操做:
1.1 格式化:日期 --->字符串
1.2 解析:格式化的逆過程,字符串 ---> 日期數據庫
2.SimpleDateFormat的實例化:new + 構造器安全
//*************照指定的方式格式化和解析:調用帶參的構造器***************** // SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //格式化 String format1 = sdf1.format(date); System.out.println(format1);//2019-02-18 11:48:27 //解析:要求字符串必須是符合SimpleDateFormat識別的格式(經過構造器參數體現), //不然,拋異常 Date date2 = sdf1.parse("2020-02-18 11:48:27"); System.out.println(date2);
小練習:ide
/* 練習一:字符串"2020-09-08"轉換爲java.sql.Date 練習二:"天打漁兩天曬網" 1990-01-01 xxxx-xx-xx 打漁?曬網? 舉例:2020-09-08 ? 總天數 總天數 % 5 == 1,2,3 : 打漁 總天數 % 5 == 4,0 : 曬網 總天數的計算? 方式一:( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1 方式二:1990-01-01 --> 2019-12-31 + 2020-01-01 -->2020-09-08 */ @Test public void testExer() throws ParseException { String birth = "2020-09-08"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf1.parse(birth); // System.out.println(date); java.sql.Date birthDate = new java.sql.Date(date.getTime()); System.out.println(birthDate); }
4.Calendar類:日曆類、抽象類線程
//1.實例化 //方式一:建立其子類(GregorianCalendar的對象 //方式二:調用其靜態方法getInstance() Calendar calendar = Calendar.getInstance(); // System.out.println(calendar.getClass()); //2.經常使用方法 //get() int days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); //set() //calendar可變性 calendar.set(Calendar.DAY_OF_MONTH,22); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //add() calendar.add(Calendar.DAY_OF_MONTH,-3); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //getTime():日曆類---> Date Date date = calendar.getTime(); System.out.println(date); //setTime():Date ---> 日曆類 Date date1 = new Date(); calendar.setTime(date1); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days);
JDK8中新日期時間APIcode
1.日期時間API的迭代:
第一代:jdk 1.0 Date類
第二代:jdk 1.1 Calendar類,必定程度上替換Date類
第三代:jdk 1.8 提出了新的一套APIorm
2.前兩代存在的問題舉例:
可變性:像日期和時間這樣的類應該是不可變的。
偏移性:Date中的年份是從1900開始的,而月份都從0開始。
格式化:格式化只對Date用,Calendar則不行。
此外,它們也不是線程安全的;不能處理閏秒等。對象
3.java 8 中新的日期時間API涉及到的包字符串
4.本地日期、本地時間、本地日期時間的使用:LocalDate / LocalTime / LocalDateTime
4.1 說明:
① 分別表示使用 ISO-8601日曆系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間信息,也不包含與時區相關的信息。
② LocalDateTime相較於LocalDate、LocalTime,使用頻率要高
③ 相似於Calendar
4.2 經常使用方法:
5.時間點:Instant
5.1 說明:
① 時間線上的一個瞬時點。 概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC開始的秒數。)
② 相似於 java.util.Date類
5.2 經常使用方法:
6.日期時間格式化類:DateTimeFormatter
6.1 說明:
① 格式化或解析日期、時間
② 相似於SimpleDateFormat
6.2 經常使用方法:
① 實例化方式:
預約義的標準格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相關的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」)
② 經常使用方法:
特別的:自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」)
// 重點:自定義的格式。如:ofPattern(「yyyy-MM-dd hh:mm:ss」)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);
7.其它API的使用 (不講)
7.1 帶時區的日期時間:ZonedDateTime / ZoneId
舉例:
// ZoneId:類中包含了所的時區信息 @Test public void test1(){ //getAvailableZoneIds():獲取所的ZoneId Set<String> zoneIds = ZoneId.getAvailableZoneIds(); for(String s : zoneIds){ System.out.println(s); } System.out.println(); //獲取「Asia/Tokyo」時區對應的時間 LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo")); System.out.println(localDateTime); } //ZonedDateTime:帶時區的日期時間 @Test public void test2(){ //now():獲取本時區的ZonedDateTime對象 ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println(zonedDateTime); //now(ZoneId id):獲取指定時區的ZonedDateTime對象 ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); System.out.println(zonedDateTime1); }
7.2 時間間隔:Duration--用於計算兩個「時間」間隔,以秒和納秒爲基準
舉例:
@Test public void test3(){ LocalTime localTime = LocalTime.now(); LocalTime localTime1 = LocalTime.of(15, 23, 32); //between():靜態方法,返回Duration對象,表示兩個時間的間隔 Duration duration = Duration.between(localTime1, localTime); System.out.println(duration); System.out.println(duration.getSeconds()); System.out.println(duration.getNano()); LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32); LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32); Duration duration1 = Duration.between(localDateTime1, localDateTime); System.out.println(duration1.toDays()); }
7.3 日期間隔:Period --用於計算兩個「日期」間隔,以年、月、日衡量
舉例:
@Test public void test4(){ LocalDate localDate = LocalDate.now(); LocalDate localDate1 = LocalDate.of(2028, 3, 18); Period period = Period.between(localDate, localDate1); System.out.println(period); System.out.println(period.getYears()); System.out.println(period.getMonths()); System.out.println(period.getDays()); Period period1 = period.withYears(2); System.out.println(period1); }
7.4 日期時間校訂器:TemporalAdjuster
舉例:
@Test public void test5(){ //獲取當前日期的下一個週日是哪天? TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY); LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster); System.out.println(localDateTime); //獲取下一個工做日是哪天? LocalDate localDate = LocalDate.now().with(new TemporalAdjuster(){ @Override public Temporal adjustInto(Temporal temporal) { LocalDate date = (LocalDate)temporal; if(date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){ return date.plusDays(3); }else if(date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){ return date.plusDays(2); }else{ return date.plusDays(1); } } }); System.out.println("下一個工做日是:" + localDate); }