3、Date
3.1、JDK7 Date缺點
1、所有的日期類都是可變的,因此他們都不是線程安全的,這是Java日期類最大的問題之一 2、Java的日期/時間類的定義並不一致,在java.util和java.sql的包中都有日期類,此外用於格式化和解析的類在java.text包中定義 3、java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,將其納入java.sql包並不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設計。對於時間、時間戳、格式化以及解析,並沒有一些明確定義的類。對於格式化和解析的需求,我們有java.text.DateFormat抽象類,但通常情況下,SimpleDateFormat類被用於此類需求 4、日期類並不提供國際化,沒有時區支持,因此Java引入了java.util.Calendar和java.util.TimeZone類,但他們同樣存在上述所有的問題
3.2、JDK8 Date優勢
1、不變性:新的日期/時間API中,所有的類都是不可變的,這對多線程環境有好處。 2、關注點分離:新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它為日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區定義了不同的類。 3、清晰:在所有的類中,方法都被明確定義用以完成相同的行為。舉個例子,要拿到當前實例我們可以使用now()方法,在所有的類中都定義了format()和parse()方法,而不是像以前那樣專門有一個獨立的類。為了更好的處理問題,所有的類都使用了工廠模式和策略模式,一旦你使用了其中某個類的方法,與其他類協同工作並不困難。 4、實用操作:所有新的日期/時間API類都實現了一系列方法用以完成通用的任務,如:加、減、格式化、解析、從日期/時間中提取單獨部分,等等。 5、可擴展性:新的日期/時間API是工作在ISO-8601日歷系統上的,但我們也可以將其應用在非IOS的日歷上。
3.3、JDK8 Date新增字段
Java.time包中的是類是不可變且線程安全的。新的時間及日期API位於java.time中,java8 time包下關鍵字段解讀。
屬性 | 含義 |
Instant | 代表的是時間戳 |
LocalDate | 代表日期,比如2020-01-14 |
LocalTime | 代表時刻,比如12:59:59 |
LocalDateTime | 代表具體時間 2020-01-12 12:22:26 |
ZonedDateTime | 代表一個包含時區的完整的日期時間,偏移量是以UTC/ 格林威治時間為基准的 |
Period | 代表時間段 |
ZoneOffset | 代表時區偏移量,比如:+8:00 |
Clock | 代表時鍾,比如獲取目前美國紐約的時間 |
3.4、獲取當前時間
Instant instant = Instant.now(); //獲取當前時間戳 LocalDate localDate = LocalDate.now(); //獲取當前日期 LocalTime localTime = LocalTime.now(); //獲取當前時刻 LocalDateTime localDateTime = LocalDateTime.now(); //獲取當前具體時間 ZonedDateTime zonedDateTime = ZonedDateTime.now(); //獲取帶有時區的時間
3.5、字符串轉換
jdk8: String str = "2019-01-11"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDate = LocalDate.parse(str, formatter); jdk7: SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = simpleDateFormat.parse(str); } catch (ParseException e){ e.printStackTrace(); }
3.6、Date轉換LocalDate
import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.util.Date; public class Test { public static void main(String[] args) { Date date = new Date(); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); // atZone()方法返回在指定時區從此Instant生成的ZonedDateTime。 LocalDate localDate = instant.atZone(zoneId).toLocalDate(); System.out.println("Date = " + date); System.out.println("LocalDate = " + localDate); } }
3.7、LocalDate轉Date
import java.time.LocalDate; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; public class Test { public static void main(String[] args) { ZoneId zoneId = ZoneId.systemDefault(); LocalDate localDate = LocalDate.now(); ZonedDateTime zdt = localDate.atStartOfDay(zoneId); Date date = Date.from(zdt.toInstant()); System.out.println("LocalDate = " + localDate); System.out.println("Date = " + date); } }
3.8、時間戳轉LocalDateTime
long timestamp = System.currentTimeMillis(); Instant instant = Instant.ofEpochMilli(timestamp); LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
3.9、LocalDateTime轉時間戳
LocalDateTime dateTime = LocalDateTime.now(); dateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); dateTime.toInstant(ZoneOffset.of("+08:00")).toEpochMilli(); dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
3.10、LocalDate方法總結
getYear() int 獲取當前日期的年份 getMonth() Month 獲取當前日期的月份對象 getMonthValue() int 獲取當前日期是第幾月 getDayOfWeek() DayOfWeek 表示該對象表示的日期是星期幾 getDayOfMonth() int 表示該對象表示的日期是這個月第幾天 getDayOfYear() int 表示該對象表示的日期是今年第幾天 withYear(int year) LocalDate 修改當前對象的年份 withMonth(int month) LocalDate 修改當前對象的月份 withDayOfMonth(intdayOfMonth) LocalDate 修改當前對象在當月的日期 isLeapYear() boolean 是否是閏年 lengthOfMonth() int 這個月有多少天 lengthOfYear() int 該對象表示的年份有多少天(365或者366) plusYears(longyearsToAdd) LocalDate 當前對象增加指定的年份數 plusMonths(longmonthsToAdd) LocalDate 當前對象增加指定的月份數 plusWeeks(longweeksToAdd) LocalDate 當前對象增加指定的周數 plusDays(longdaysToAdd) LocalDate 當前對象增加指定的天數 minusYears(longyearsToSubtract) LocalDate 當前對象減去指定的年數 minusMonths(longmonthsToSubtract) LocalDate 當前對象減去注定的月數 minusWeeks(longweeksToSubtract) LocalDate 當前對象減去指定的周數 minusDays(longdaysToSubtract) LocalDate 當前對象減去指定的天數 compareTo(ChronoLocalDateother) int 比較當前對象和other對象在時間上的大小,返回值如果為正,則當前對象時間較晚, isBefore(ChronoLocalDateother) boolean 比較當前對象日期是否在other對象日期之前 isAfter(ChronoLocalDateother) boolean 比較當前對象日期是否在other對象日期之后 isEqual(ChronoLocalDateother) boolean 比較兩個日期對象是否相等