JDK1.8の日付処理
例1、Java 8で今日の日付を取得する
例2、Java 8で年、月、日の情報を取得する
例3、Java 8で特定の日付を処理する
例4、Java 8で2つの日付が等しいか否かを判断する
例5、Java 8で誕生日のような周期的なイベントをチェックする
例6.Java 8で現在時刻を取得する
例7、既存時間で時間を増やす方法
例8、1週間後の日付の計算方法
例9.1年前または1年後の日付の計算
例10、Java 8を用いたClockクロッククラス
例11.Javaを使用して、日付が他の日付より早いか遅いかを判断する方法
例12.Java 8におけるタイムゾーンの処理
例13、クレジットカードの満期という固定日をどう表すか、答えはYearMonth
例14.Java 8で閏年をチェックする方法
例15、2つの日付間の日数と月数の計算
例16.時差情報を含む日時
例17.Java 8で現在のタイムスタンプを取得する
例18、Java 8で定義済みフォーマットツールを使用して日付を解析またはフォーマットする方法
例19、Javaでカスタムフォーマットツールを使用して日付を解析する方法
例20、Java 8で日付を文字列に変換する方法
Java 8日時APIのポイント
Lambda式、streams、および一連の小さな最適化に伴い、Java 8は新しい日時APIを発表し、チュートリアルでは簡単な例を通じて新しいAPIの使用方法を学びます.Javaは日付、カレンダー、時間を処理する方法がコミュニティに非難され、java.util.Dateを可変タイプに設定し、SimpleDateFormatの非スレッドセキュリティを適用することは非常に制限されています.Javaも、コミュニティでJodaTime APIを使用することに慣れている人々を満たすために、より良いAPIが必要であることを認識しています.新しいAPIの多くのメリットの1つは、日付時間の概念を明確にすることです.例:瞬時(instant)、長さ(duration)、日付、時間、タイムゾーンおよびサイクル.Jodaライブラリが人間の言語およびコンピュータによってそれぞれ解析される時間処理方式を継承しています.古いバージョンとは異なり、新しいAPIはISO標準カレンダーシステムに基づいており、java.timeパッケージの下にあるすべてのクラスは可変タイプであり、スレッドは安全です.次のように、新しいAPIのjava.timeパッケージのいくつかの重要なクラスがあります.
新しいAPIには、ZoneOffSetクラスとZoneIdクラスも導入されており、タイムゾーンの問題をより簡単に解決できます.解析・フォーマット時間のDateTimeFormatterクラスもすべて再設計される.この記事は、Java 8が1年前にリリースされるときに書いたもので、次のサンプルコードの時間はその年で、これらの例を実行すると現在の時間が返されます.
Java 8での日付と時刻の処理方法
新しいライブラリを学ぶ最善の方法は何ですか?私の答えは実際のプロジェクトでそれを使用することです.プロジェクトには、開発者が新しいライブラリを発掘し、学ぶための真のニーズがたくさんあります.簡単に言えば、タスク駆動学習探索です.このJava 8の新しい日時APIも例外ではありません.Java 8の新しい特性を学ぶために、タスクベースのインスタンスを20個作成しました.最も簡単に作成された日付から開始し、タイム・トゥ・タイム・ゾーンを作成し、誕生日、記念日、請求書日、保険料の満期日、クレジット・カードの満期日など、重要な日付の満期日を計算する日付アラート・アプリケーションのタスクをシミュレートします.
例1、Java 8で今日の日付を取得する
Java 8のLocalDateは、その日の日付を表すために使用されます.とjava.util.Dateは異なり、日付のみで、時間は含まれません.日付を表すだけでこのクラスを使用します.
-
LocalDate today = LocalDate.now();
-
System.out.println(
"Today's Local date : " + today);
:
Today's Local date : 2014-01-14
上面的代码创建了当天的日期,不含时间信息。打印出的日期格式非常友好,不像老的Date类打印出一堆没有格式化的信息。
示例 2、在Java 8中获取年、月、日信息
LocalDate类提供了获取年、月、日的快捷方法,其实例还包含很多其它的日期属性。通过调用这些方法就可以很方便的得到需要的日期信息,不用像以前一样需要依赖java.util.Calendar类了。
-
LocalDate today = LocalDate.now();
-
int year = today.getYear();
-
int month = today.getMonthValue();
-
int day = today.getDayOfMonth();
-
System.out.printf(
"Year : %d Month : %d day : %d t %n", year, month, day);
:
-
Today
's Local date : 2014-01-14
-
Year :
2014
Month :
1
day :
14
, Java 8 、 、 , , 。 Java 。
3、 Java 8
, now() , LocalDate.of() , 、 、 , LocalDate 。 API , 1900, 0 。 , 1 14 , 。
-
LocalDate dateOfBirth = LocalDate.of(
2010,
01,
14);
-
System.out.println(
"Your Date of birth is : " + dateOfBirth);
Output : Your Date of birth is : 2010-01-14
, 2010 1 14 。
4、 Java 8
。 , 、 。 , 。 Java 8 , ,LocalDate equal , :
-
LocalDate date1 = LocalDate.of(
2014,
01,
14);
-
if(date1.equals(today)){
-
System.out.printf(
"Today %s and date1 %s are same date %n", today, date1);
-
}
:
today 2014-01-14 and date1 2014-01-14 are same date
。 , , 。 Java , 。
5、 Java 8
Java 、 、EMI 。 , 、 。Java ? MonthDay 。 , , 。 YearMonth 。 。 MonthDay :
-
LocalDate dateOfBirth = LocalDate.of(
2010,
01,
14);
-
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth());
-
MonthDay currentMonthDay = MonthDay.from(today);
-
-
-
if(currentMonthDay.equals(birthday)){
-
System.out.println(
"Many Many happy returns of the day !!");
-
}
else{
-
System.out.println(
"Sorry, today is not your birthday");
-
}
:
Many Many happy returns of the day !!
, 。 , , 。
6、 Java 8
Java 8 , LocalTime , LocalDate 。 now() 。 hh:mm:ss:nnn。 Java 8 。
-
LocalTime time = LocalTime.now();
-
System.out.println(
"local time now : " + time);
:
local time now : 16:33:33.369 // in hour, minutes, seconds, nano seconds
, 。
7、
、 、 。Java 8 , plusHours() add(), 。 , LocalTime , , 。
-
LocalTime time = LocalTime.now();
-
LocalTime newTime = time.plusHours(
2);
// adding two hours
-
System.out.println(
"Time after 2 hours : " + newTime);
:
Time after 2 hours : 18:33:33.369
, 16:33:33.369 2 。 Java , 。
8、
, 。LocalDate , plus() 、 、 ,ChronoUnit 。 LocalDate , 。
-
LocalDate nextWeek = today.plus(
1, ChronoUnit.WEEKS);
-
System.out.println(
"Today is : " + today);
-
System.out.println(
"Date after 1 week : " + nextWeek);
:
-
Today
is :
2014
-01
-14
-
Date after
1 week :
2014
-01
-21
7 , 。 1 、1 、1 、1 , Java 8 API ChronoUnit 。
9、
, LocalDate plus() 、 , minus() 。
-
LocalDate previousYear = today.minus(
1, ChronoUnit.YEARS);
-
System.out.println(
"Date before 1 year : " + previousYear);
-
-
-
LocalDate nextYear = today.plus(
1, YEARS);
-
System.out.println(
"Date after 1 year : " + nextYear);
:
-
Date before
1
year :
2013
-01
-14
-
Date after
1
year :
2015
-01
-14
, 2013 、 2015 、 2014 。
10、 Java 8 Clock
Java 8 Clock , 。 System.currentTimeMillis() TimeZone.getDefault() Clock 。
-
// Returns the current time based on your system clock and set to UTC.
-
Clock clock = Clock.systemUTC();
-
System.out.println(
"Clock : " + clock);
-
-
-
// Returns time based on system clock zone
-
Clock defaultClock = Clock.systemDefaultZone();
-
System.out.println(
"Clock : " + clock);
:
-
Clock :
SystemClock
[Z]
-
Clock :
SystemClock
[Z]
clock , :
-
public
class MyClass {
-
private Clock clock;
// dependency inject
-
...
-
public void process(LocalDate eventDate) {
-
if (eventDate.isBefore(LocalDate.now(clock)) {
-
...
-
}
-
}
-
}
。
11、 Java
? Java 8 ,LocalDate isBefore() isAfter() 。 isBefore() , true。
-
LocalDate tomorrow = LocalDate.of(
2014,
1,
15);
-
if(tommorow.isAfter(today)){
-
System.out.println(
"Tomorrow comes after today");
-
}
-
-
-
LocalDate yesterday = today.minus(
1, DAYS);
-
-
-
if(yesterday.isBefore(today)){
-
System.out.println(
"Yesterday is day before today");
-
}
-
:
-
Tomorrow comes after today
-
Yesterday
is
day before today
Java 8 , Calendar 。
12、 Java 8
Java 8 , 。 ZoneId ,ZoneDateTime 。 Java 8 GregorianCalendar 。 。
-
// Date and time with timezone in Java 8
-
ZoneId america = ZoneId.of(
"America/New_York");
-
LocalDateTime localtDateAndTime = LocalDateTime.now();
-
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
-
System.out.println(
"Current date and time in a particular timezone : " + dateAndTimeInNewYork);
:
Current date and time in a particular timezone : 2014-01-14T16:33:33.373-05:00[America/New_York]
GMT 。 , Java 8 , , :
-
Exception
in thread
"main" java.
time.zone.ZoneRulesException: Unknown
time-zone ID: ASIA/Tokyo
-
at java.
time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:
272)
-
at java.
time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:
227)
-
at java.
time.ZoneRegion.ofId(ZoneRegion.java:
120)
-
at java.
time.ZoneId.of(ZoneId.java:
403)
-
at java.
time.ZoneId.of(ZoneId.java:
351)
13、 , YearMonth
MonthDay ,YearMonth , 、FD 、 。 ,YearMonth lengthOfMonth() , 2 28 29 。
-
YearMonth currentYearMonth = YearMonth.now();
-
System.out.printf(
"Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());
-
YearMonth creditCardExpiry = YearMonth.of(
2018, Month.FEBRUARY);
-
System.out.printf(
"Your credit card expires on %s %n", creditCardExpiry);
:
-
Days
in
month
year
2014
-01:
31
-
Your credit card expires
on
2018
-02
, , 。
14、 Java 8
LocalDate isLeapYear() , , , Java 。
-
if(today.isLeapYear()){
-
System.out.println(
"This year is Leap year");
-
}
else {
-
System.out.println(
"2014 is not a Leap year");
-
}
:
2014 is not a Leap year
, JUnit 。
15、
、 。 Java 8 java.time.Period 。 , 。
-
LocalDate java8Release = LocalDate.of(
2014, Month.MARCH,
14);
-
Period periodToNextJavaRelease = Period.between(today, java8Release);
-
System.out.println(
"Months left between today and Java 8 release : "
-
+ periodToNextJavaRelease.getMonths() );
:
Months left between today and Java 8 release : 2
,Java 8 3 , 。
16、
Java 8 ,ZoneOffset , GMT UTC +05:30, ZoneOffset.of() 。 LocalDateTime ZoneOffset OffSetDateTime 。
-
LocalDateTime datetime = LocalDateTime.of(
2014, Month.JANUARY,
14,
19,
30);
-
ZoneOffset offset = ZoneOffset.of(
"+05:30");
-
OffsetDateTime date = OffsetDateTime.of(datetime, offset);
-
System.out.println(
"Date and Time with timezone offset in Java : " + date);
:
Date and Time with timezone offset in Java : 2014-01-14T19:30+05:30
。 :OffSetDateTime ,ZoneDateTime 。
17、 Java 8
Java 8 , 。Instant now() , :
-
Instant timestamp = Instant.now();
-
System.out.println(
"What is value of this instant " + timestamp);
:
What is value of this instant 2014-01-14T08:33:33.379Z
, java.util.Date 。 Instant Java 8 Date , Date Instant , :Date.from(Instant) Instant java.util.Date,Date.toInstant() Date Instant 。
18、 Java 8
Java 8 , , SimpleDateFormat , 。 , 。Java 8 , 。 。 BASIC_ISO_DATE 2014 1 14 20140114。
-
String dayAfterTommorrow =
"20140116";
-
LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
-
DateTimeFormatter.BASIC_ISO_DATE);
-
System.out.printf(
"Date generated from String %s is %s %n",
-
dayAfterTommorrow, formatted);
-
:
Date generated from String 20140116 is 2014-01-16
, 。
19、 Java
Java 。 , , 。 “MMM dd yyyy”。 DateTimeFormatter ofPattern() , ,M ,m 。 DateTimeParseException , M m 。
-
String goodFriday =
"Apr 18 2014";
-
try {
-
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"MMM dd yyyy");
-
LocalDate holiday = LocalDate.parse(goodFriday, formatter);
-
System.out.printf(
"Successfully parsed String %s, date is %s%n", goodFriday, holiday);
-
}
catch (DateTimeParseException ex) {
-
System.out.printf(
"%s is not parsable!%n", goodFriday);
-
ex.printStackTrace();
-
}
-
:
Successfully parsed String Apr 18 2014, date is 2014-04-18
, 。
20、 Java 8
DateTimeFormatter , 。 , LocalDateTime 。 Java 。 。 , DateTimeFormatter , format() , parse() 。 。
-
LocalDateTime arrivalDate = LocalDateTime.now();
-
try {
-
DateTimeFormatter format = DateTimeFormatter.ofPattern(
"MMM dd yyyy hh:mm a");
-
String landing = arrivalDate.format(format);
-
System.out.printf(
"Arriving at : %s %n", landing);
-
}
catch (DateTimeException ex) {
-
System.out.printf(
"%s can't be formatted!%n", arrivalDate);
-
ex.printStackTrace();
-
}
:
Arriving at : Jan 14 2014 04:33 PM
が されている「MMM ddyyyyyyyy hh:mm a」 はフォーマットされており、フォーマットには3つの を す が まれており、 の ろにAMとPMマークが いています.
Java 8 APIのポイント
これらの を して、Java 8 APIの しい を につけたに いありません.このエレガントなAPIの ポイントを り ってみましょう.
1)javaxが する.time.ZoneIdはタイムゾーンを します.
2)LocalDateとLocalTimeクラスが されている.
3)Java 8のすべての APIは クラスであり、スレッドは であるが、 のDateとCalendar APIのjava.util.DateとSimpleDateFormatは スレッドで です.
4)メインパッケージはjava.timeは、 、 、 を すクラスを む. には2つのサブパッケージjavaが っています.time.formatはフォーマットに されますjava.time.temporalは、より レベルの に されます.
5)タイムゾーンは のある で に われている を している. タイムゾーンには があり、フォーマットは / で され(Asia/Tokyo)、グリニッジやUTCとの を えている. えば、 の は+09:00である.
6)OffsetDateTimeクラスは にLocalDateTimeクラスとZoneOffsetクラスを み わせている.グリニッジまたはUTCとの を む な ( 、 、 )と ( 、 、 、ナノ )の を すために されます.
7)DateTimeFormatterクラスは、 をフォーマットおよび するために されます.SimpleDateFormatとは なり,このクラスは でスレッドが であり, に じて に を り てることができる.DateTimeFormatterクラスには、 くの み みフォーマットツールが されており、カスタマイズも です. にはparse()が を に し、 エラーが するとDateTimeParseExceptionが されます.DateTimeFormatterクラスにはformat()もあり、エラーが するとDateTimeException が されます.
8)さらに すると、 フォーマット「MMM d yyyy」と「MMM dd yyyy」には な いがあり、1つ のフォーマットは「Jan 2 2014」と「Jan 14 2014」を することができ、2つ のフォーマットは「Jan 2 2014」を すると を げ す.2つ のフォーマットでは が ず2 であることが されるからだ. するには、 が1 しかない に にゼロを う があります.つまり、「Jan 2 2014」は「Jan 02 2014」と くべきです.
Java 8の しい APIの い について します.これらの な は、 しいAPIの を けるのに に ちます.これらの はすべて のタスクに づいているので、Javaの のプログラミングをするときはもうあれこれ す はありません. インスタンスの と を び, , と を む ,2つの の の を び,これらは と の の で されている.Java 8でどのようにスレッドが に を しフォーマットするかを び, なスレッドローカル を する がなく,Joda Timeサードパーティライブラリに する もない. しいAPIは、 を する とすることができる.