1.不変性
新しい日付/時刻のAPIは、すべてのクラスは、マルチスレッド環境に適している、不変です。
たとえば、次のようにLocalDateTimeを
関心事の分離2.
日付(日付)、時間(タイム)、日付と時刻(日時)、タイムスタンプ(UNIXタイムスタンプ)であり、異なるタイムゾーンを定義する新しいAPIの人間が読めると機械時間の日付と時刻(UNIXタイムスタンプ)明確な分離、クラス。
など、様々なカテゴリーに分け、異なる時間、時:などLOCALDATE、にLocalTime、LocalDateTimeを、インスタント、年、月、YEARMONTH、MONTHDAY、のDayOfWeek、異なるシナリオの様々なニーズにお応えしています。
3.クリア
すべてのクラスでは、方法は明らかに同じ動作を達成するために定義されています。
例えば、現在のインスタンスを取得するために、我々は今、()メソッドを使用することができ、すべてのクラスが形式で定義されている中で()およびparse()メソッド、以前のように別々の特別なクラスを持っているのではなく。、明確な明確な、統一された、覚えやすい方法。
4.実際の操作
(ツール・メソッドの多くと同等、私たち自身のラップに不要になったが):日から、加算、減算、書式設定の解析:すべての新しい日付/時刻のAPIクラスは、以下のような一般的なタスクを実行する方法の範囲を実装します/時間の別個の部分、等を抽出します。
たとえば、次のLocalDateTimeは、(それぞれのフィールド、フィールドの変更、増減、等を得る変換)非常に豊富な実用的な操作を含んでいます。
5.TemporalAdjusterは、あなたが日付を操作するために、より洗練された方法を使用することができます
あなたは、それがもはや値に制限されて変更できません、あなたは需要に応じて、独自の日付コンバータを定義することができます。たとえば、次の次の日曜日、翌営業日、または月の最後の日までの日付の変更。
lastDayOfMonthは新しい日付、その値の月の最終日を作成します。
6.比較欠点JDK7前の日時と改良されたクラス
6.1 日付とカレンダーは、使用上の問題に不便です
(1)new Date(2019,01,01)
实际是3919年2月。因为Date的构造函数 的年份表示的始于1900年的差值。
LocalDate创建实例:
LocalDate localDate = LocalDate.of(2019, 1, 1);
(2)month是从0开始的。
LocalDate month是从1开始的:
LocalDate localDate = LocalDate.of(2019, 1, 1);
System.out.println(localDate.getMonthValue());
输出是1
(3)DAY_OF_WEEK 的取值,是从周日(1)开始的。
LocalDate week是从周一(1)开始的:
LocalDate localDate = LocalDate.of(2019, 1, 1);
System.out.println(localDate.getDayOfWeek());
System.out.println(localDate.getDayOfWeek().getValue());
输出
TUESDAY
2
(4)Date如果不格式化,打印出的日期可读性差。
LocalDate的输出,清晰。
LocalDate localDate = LocalDate.of(2019, 1, 1);
System.out.println(localDate.getMonthValue());
System.out.println(localDate.toString());
输出:
2019-01-01
(5)日期类并不提供国际化,没有时区支持
java8的时间类都支持了时区操作。
例如:LocalDateTime
//中国时间,输出时不包含时区 LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); System.out.println(ldt); //意大利罗马时间,输出时包含时区 ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Rome")); System.out.println(zdt);
输出
2019-12-20T23:17:07.914 2019-12-20T16:17:07.915+01:00[Europe/Rome]
6.2 线程安全问题
(1)Date、Calendar可变性,线程安全问题
java8中所有类都是final修饰的,每次修改都会生成新的副本。
(2)DateFormat和SimpleDateFormat线程安全问题
java8中的DateTimeFormatter也是不可变的,源码:
6.3 java8对日期api进行系统的设计,增加了许多实用方便的操作,几乎不用再使用dateutil额外工具类。
比如,增加一天。
LocalDate localDate = LocalDate.of(2019, 1, 1); LocalDate localDate2 = localDate.plusDays(1); System.out.println("localDate:"+localDate); System.out.println("localDate2:"+localDate2);
输出:
localDate:2019-01-01
localDate2:2019-01-02
参考:https://blog.csdn.net/wangsun300/article/details/103403490