摘要:這個月的天數是否事閏年似地,一天中的時間,比如,可以使用類表示。使用靜態方法,你可以實現這一目的合并日期和時間這個復合類名叫,是和的合體。對于最常見的用例,日期和時間已經提供了大量預定義的。
Java的API提供了很多有用的組件,能幫助你構建復雜的應用。不過,Java API也不總是完美的。我們相信大多數有經驗的程序員都會贊同Java 8之前的庫對日期和時間的支持就非常不理想。然而,你也不用太擔心:Java 8中引入全新的日期和時間API就是要解決這一問題。
1 LocalDate 、 LocalTime 、 Instant 、 Duration 以及 Period讓我們從探索如何創建簡單的日期和時間間隔入手。 java.time 包中提供了很多新的類可以幫你解決問題,它們是 LocalDate 、 LocalTime 、 Instant 、 Duration 和 Period 。
LocalDate 類,該類的實例是一個不可變對象,它只提供了簡單的日期,并不含當天的時間信息。另外,它也不附帶任何與時區相關的信息。
你可以通過靜態工廠方法 of 創建一個 LocalDate 實例。 LocalDate 實例提供了多種方法來讀取常用的值,比如年份、月份、星期幾等。
public static void main(String[] args) {
//2014-3-18
LocalDate date = LocalDate.of(2014, 3, 18);
//2014
int year = date.getYear();
//march
Month month = date.getMonth();
//18
int day = date.getDayOfMonth();
DayOfWeek dow = date.getDayOfWeek();
//這個月的天數
int len = date.lengthOfMonth();
//是否事閏年
boolean leap = date.isLeapYear();
System.out.println("year : " + year + " month : " + month + " day : " + day +
" dow : " + dow + " len : " + len + " leap : " + leap);
}
似地,一天中的時間,比如13:45:20,可以使用 LocalTime 類表示。你可以使用 of 重載的兩個工廠方法創建 LocalTime 的實例。第一個重載函數接收小時和分鐘,第二個重載函數同時還接收秒。同 LocalDate 一樣, LocalTime 類也提供了一些 getter 方法訪問這些變量的值。
LocalTime time = LocalTime.of(13, 45, 20); int hour = time.getHour(); int minute = time.getMinute(); int second = time.getSecond();
LocalDate 和 LocalTime 都可以通過解析代表它們的字符串創建。使用靜態方法 parse ,你可以實現這一目的:
LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time = LocalTime.parse("13:45:20");
這個復合類名叫 LocalDateTime ,是 LocalDate 和 LocalTime 的合體。它同時表示了日期和時間,但不帶有時區信息,你可以直接創建,也可以通過合并日期和時間對象構造。
// 2014-03-18T13:45:20 LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(13, 45, 20); LocalDateTime dt4 = date.atTime(time); LocalDateTime dt5 = time.atDate(date);
通過它們各自的 atTime 或者 atDate 方法,向 LocalDate 傳遞一個時間對象,或者向LocalTime 傳遞一個日期對象的方式,你可以創建一個 LocalDateTime 對象。你也可以使用toLocalDate 或者 toLocalTime 方法,從 LocalDateTime 中提取 LocalDate 或者 LocalTime組件:
LocalDate date1 = dt1.toLocalDate(); LocalTime time1 = dt1.toLocalTime();
Duration 類的靜態工廠方法 between 就是為比較兩個時間而設計的。你可以創建兩個 LocalTimes 對象、兩個 LocalDateTimes對象,或者兩個 Instant 對象之間的 duration:
Duration d1 = Duration.between(time1, time2); Duration d1 = Duration.between(dateTime1, dateTime2);
如果你需要以年、月或者日的方式對多個時間單位建模,可以使用 Period 類。使用該類的工廠方法 between ,你可以使用得到兩個 LocalDate 之間的時長:
Period tenDays = Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18));
最后, Duration 和 Period 類都提供了很多非常方便的工廠類,直接創建對應的實例;換句話說,就像下面這段代碼那樣,不再是只能以兩個temporal對象的差值的方式來定義它們的對象。
Duration threeMinutes = Duration.ofMinutes(3); Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES); Period tenDays = Period.ofDays(10); Period threeWeeks = Period.ofWeeks(3); Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
Duration 類和 Period 類共享方法
2 操縱、解析和格式化日期
//2019-3-20
LocalDate of = LocalDate.of(2019, 3, 20);
//2018-3-20
LocalDate localDate = of.withYear(2018);
//2018-4-20
LocalDate localDate1 = localDate.withMonth(4);
//2018-9-20
LocalDate with = localDate1.with(ChronoField.MONTH_OF_YEAR, 9);
最后這一行中使用的 with 方法和get方法有些類似,它們都聲明于 Temporal 接口,所有的日期和時間API類都實現這兩個方法,它們定義了單點的時間,比如 LocalDate 、 LocalTime 、 LocalDateTime 以及 Instant 。更確切 地說,使用 get 和 with 方法,我們可以將 Temporal 對象值的讀取和修改區分開。
//2014-3-18 LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-3-25 LocalDate date2 = date1.plusWeeks(1); LocalDate date3 = date2.minusYears(3); LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);
最后一行使用的 plus 方法也是通用方法,它和 minus 方法都聲明于 Temporal 接口中。通過這些方法,對 TemporalUnit 對象加上或者減去一個數字,我們能非常方便地將 Temporal 對象前溯或者回滾至某個時間段,通過ChronoUnit 枚舉我們可以非常方便地實現 TemporalUnit 接口。
有的時候,你需要進行一些更加復雜的操作,比如,將日期調整到下個周日、下個工作日,或者是本月的最后一天。這時,你可以使用重載版本的 with 方法,向其傳遞一個提供了更多定制化選擇的 TemporalAdjuster 對象,更加靈活地處理日期。對于最常見的用例,日期和時間API已經提供了大量預定義的TemporalAdjuster 。你可以通過 TemporalAdjuster 類的靜態工廠方法訪問它們。
//2014-03-18 LocalDate date1 = LocalDate.of(2014, 3, 18); //2014-03-23 LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY)); //2014-03-31 LocalDate date3 = date2.with(lastDayOfMonth());
正如我們看到的,使用 TemporalAdjuster 我們可以進行更加復雜的日期操作,而且這些方 法的名稱也非常直觀,方法名基本就是問題陳述。此外,即使你沒有找到符合你要求的預定義的 TemporalAdjuster ,創建你自己的 TemporalAdjuster 也并非難事。實際上, Temporal- Adjuster 接口只聲明了單一的一個方法(這使得它成為了一個函數式接口)。
@FunctionalInterface public interface TemporalAdjuster { Temporal adjustInto(Temporal temporal); }
這意味著 TemporalAdjuster 接口的實現需要定義如何將一個 Temporal 對象轉換為另一個 Temporal 對象。你可以把它看成一個 UnaryOperator
設計一個 NextWorkingDay 類,該類實現了 TemporalAdjuster 接口,能夠計算明天的日期,同時過濾掉周六和周日這些節假日。格式如下所示:
public class MyTemporalAdjuster {
public static void main(String[] args) {
LocalDate of = LocalDate.of(2019, 3, 20);
LocalDate with = of.with(new NewTemporalAdjuster());
System.out.println("with = " + with);
}
}
//如果當天的星期介于周一至周五之間,日期向后移動一天;如果當天是周六或者周日,則返回下一個周一
class NewTemporalAdjuster implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
DayOfWeek of = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
if (of == DayOfWeek.FRIDAY){
dayToAdd = 3;
}else if (of == DayOfWeek.SATURDAY){
dayToAdd = 2;
}
return temporal.plus(dayToAdd, ChronoUnit.DAYS);
}
}
處理日期和時間對象時,格式化以及解析日期?時間對象是另一個非常重要的功能。新的java.time.format 包就是特別為這個目的而設計的。這個包中,最重要的類是 DateTimeFormatter 。創建格式器最簡單的方法是通過它的靜態工廠方法以及常量。像 BASIC_ISO_DATE和 ISO_LOCAL_DATE 這 樣 的 常 量 是 DateTimeFormatter 類 的 預 定 義 實 例 。 所 有 的DateTimeFormatter 實例都能用于以一定的格式創建代表特定日期或時間的字符串。
LocalDate date = LocalDate.of(2014, 3, 18); //20140318 String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //2014-03-18 String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
你也可以通過解析代表日期或時間的字符串重新創建該日期對象。所有的日期和時間API都提供了表示時間點或者時間段的工廠方法,你可以使用工廠方法 parse 達到重創該日期對象的目的:
LocalDate date1 = LocalDate.parse("20140318",DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2014-03-18",DateTimeFormatter.ISO_LOCAL_DATE);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date1 = LocalDate.of(2014, 3, 18);
String formattedDate = date1.format(formatter);
LocalDate date2 = LocalDate.parse(formattedDate, formatter);
LocalDate 的 formate 方法使用指定的模式生成了一個代表該日期的字符串。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/6903.html
摘要:這個月的天數是否事閏年似地,一天中的時間,比如,可以使用類表示。使用靜態方法,你可以實現這一目的合并日期和時間這個復合類名叫,是和的合體。對于最常見的用例,日期和時間已經提供了大量預定義的。Java的API提供了很多有用的組件,能幫助你構建復雜的應用。不過,Java API也不總是完美的。我們相信大多數有經驗的程序員都會贊同Java 8之前的庫對日期和時間的支持就非常不理想。然而,你也不用太...
摘要:這個月的天數是否事閏年似地,一天中的時間,比如,可以使用類表示。使用靜態方法,你可以實現這一目的合并日期和時間這個復合類名叫,是和的合體。對于最常見的用例,日期和時間已經提供了大量預定義的。Java的API提供了很多有用的組件,能幫助你構建復雜的應用。不過,Java API也不總是完美的。我們相信大多數有經驗的程序員都會贊同Java 8之前的庫對日期和時間的支持就非常不理想。然而,你也不用太...
摘要:線程掛起,線程繼續走,還會被繼續使用方法,而這時用的是線程設置的值了,而這就是引發問題的根源,出現時間不對,線程掛死等等。建議為每個線程創建單獨的格式實例。其中工作隊列使用的是,源碼頭部的注釋中有說明截取的部分。 閱讀本文大概需要 3.2 分鐘。 前言 日常開發中,我們經常需要使用時間相關類,想必大家對SimpleDateFormat并不陌生。主要是用它進行時間的格式化輸出和解析,...
摘要:所以說我們的線程最好是交由線程池來管理,這樣可以減少對線程生命周期的管理,一定程度上提高性能。線程池不接收新任務,不處理已添加的任務,并且會中斷正在處理的任務。當所有的任務已終止,記錄的任務數量為,線程池會變為狀態。線程池徹底終止的狀態。 前言 只有光頭才能變強 回顧前面: ThreadLocal就是這么簡單 多線程三分鐘就可以入個門了! 多線程基礎必要知識點!看了學習多線程事半功倍...
摘要:時間年月日星期四說明本文部分內容均來自慕課網。那么里面的數據就可以分為各種各樣的索引,比如汽車索引圖書索引家具索引等等。圖書索引又可以細分為各種類型,比如科普類小說類技術類等等。具體到每一本書籍,就是文檔,就是整個圖書里面最小的存儲單位。 時間:2017年09月14日星期四說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https...
閱讀 2505·2023-04-25 19:31
閱讀 2239·2021-11-04 16:11
閱讀 2805·2021-10-08 10:05
閱讀 1515·2021-09-30 09:48
閱讀 2315·2019-08-30 15:56
閱讀 2406·2019-08-30 15:56
閱讀 2174·2019-08-30 15:53
閱讀 2268·2019-08-30 15:44