JDK 1.8完全日時Api(文末付例)
12606 ワード
一、背景フォーマットされていない場合、 は
二、
2.1
2.2
2.3
2.4
2.5
2.5
三、時間操作
3.1時間比較
3.2年数、月数、日数の増加/減少
3.3時間変更
3.4時間計算 メソッド名
説明
同じ月の週の日付を返します.
当月の初日にもどる
来月の初日に戻る
次の年の初日に戻る
本年の初日に戻る
同じ月の最初の曜日を返します.
当月の最終日に戻る
来月の最終日に戻る
次の年の最後の日に戻る
本年最後の日に戻る
同じ月の最後の曜日を返します
次の/前の指定された曜日を返します.
次の曜日/前の曜日を返します.この値が条件を満たしている場合は、直接返します.
四、時間日付フォーマット
4.1フォーマット時間
4.2解析時間
4.1でどのようにフォーマットするかは,ここで同様に解析する必要がある.
五、まとめ は、
5.1サンプルコード
Githubサンプルコード
5.2技術交流風塵ブログ 風塵ブログ-掘金 風塵ブログ-ブログ園 Github
jdk 1.8
の前に、Java
時間はjava.util.Date
およびjava.util.Calendar
クラスを使用する.Date today = new Date();
System.out.println(today);
//
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String todayStr = sdf.format(today);
System.out.println(todayStr);
Date
のいくつかの質問:Date
で印刷された日付の可読性が悪い.SimpleDateFormat
を使用して時間をフォーマットすることができるが、SimpleDateFormat
はスレッドが安全ではない(アリババ開発マニュアルではstatic
を無効にしてSimpleDateFormat
を修飾する).Date
は、ある年、ある月、ある週、n
日以降の時間を取得したいなど、時間処理が面倒で、Date
で処理するのは本当に難しいし、Date
類のgetYear()
、getMonth()
の方法は廃棄されています.二、
JDK 1.8
新しい日時タイプJava8
が導入した新しい一連のAPI
は、時間日付の処理をよりよくサポートし、時間日付のいくつかの概念を明確に定義し、例えば、瞬時時間(Instant
)、持続時間(duration
)、日付(date
)、時間(time
)、時間領域(time-zone
)、および時間帯(Period
)を定義する.LocalDate
:時間を含まない日付、例えば2019-10-14
.誕生日、周年記念日、入社日などを保存するのに使えます.LocalTime
:LocalDate
と対照的で、日付を含まない時間です.LocalDateTime
:日付と時刻が含まれており、オフセット情報(タイムゾーン)はありません.ZonedDateTime
:タイムゾーンの完全な日付時間を含み、オフセット量はUTC
/グリニッジ時間を基準とする.Instant
:System.currentTimeMillis()
と同様のタイムスタンプ.Duration
:期間を表します.Period
:年月日で1つの期間を測定することを表す.DateTimeFormatter
:新しい日付解析フォーマットクラス.2.1
LocalDate
LocalDate
クラスには日付のみが含まれ、特定の時間は含まれません.時間を含まずに日付を表すだけで使用できます.public static void localDate() {
//
LocalDate today = LocalDate.now();
System.out.println(" :" + today);
//
int thisYear = today.getYear();
int thisYearAnother = today.get(ChronoField.YEAR);
System.out.println(" " + thisYear + " ");
System.out.println(" " + thisYearAnother + " ");
//
Month thisMonth = today.getMonth();
System.out.println(thisMonth.toString());
// ( )
int monthOfYear = today.getMonthValue();
// int monthOfYear = today.get(ChronoField.MONTH_OF_YEAR);
System.out.println(" " + monthOfYear + " ");
//
int length = today.lengthOfMonth();
System.out.println(" " + length + " ");
//
int thisDay = today.getDayOfMonth();
int thisDayAnother = today.get(ChronoField.DAY_OF_MONTH);
System.out.println(" " + thisDay + " ");
System.out.println(" " + thisDayAnother + " ");
//
DayOfWeek thisDayOfWeek = today.getDayOfWeek();
System.out.println(thisDayOfWeek.toString());
//
int dayOfWeek = today.get(ChronoField.DAY_OF_WEEK);
System.out.println(" " + dayOfWeek + " ");
//
boolean leapYear = today.isLeapYear();
System.out.println(" :" + leapYear);
//
LocalDate anotherDay = LocalDate.of(2008, 8, 8);
System.out.println(" :" + anotherDay);
}
2.2
LocalTime
LocalTime
は時間のみを取得し、日付は取得しません.LocalTime
とLocalDate
は同様で、LocalDateには特定の時間が含まれておらず、LocalTime
には特定の日付が含まれていないという違いがあります.public static void localTime() {
//
LocalTime nowTime = LocalTime.now();
System.out.println(" :" + nowTime);
//
int hour = nowTime.getHour();
int thisHour = nowTime.get(ChronoField.HOUR_OF_DAY);
System.out.println(" :" + hour);
System.out.println(" :" + thisHour);
//
int minute = nowTime.getMinute();
int thisMinute = nowTime.get(ChronoField.MINUTE_OF_HOUR);
System.out.println(" :" + minute);
System.out.println(" :" + thisMinute);
//
int second = nowTime.getSecond();
int thisSecond = nowTime.get(ChronoField.SECOND_OF_MINUTE);
System.out.println(" :" + second);
System.out.println(" :" + thisSecond);
// ( )
LocalTime anotherTime = LocalTime.of(20, 8, 8);
System.out.println(" :" + anotherTime);
}
2.3
LocalDateTime
LocalDateTime
は日付と時刻の組み合わせを表す.of()メソッドによって直接作成することもできるし、LocalDate
のatTime()
メソッドまたはLocalTime
のatDate()
メソッドを呼び出してLocalDate
またはLocalTime
を1つのLocalDateTime
に統合することもできる.public static void localDateTime() {
//
LocalDateTime today = LocalDateTime.now();
System.out.println(" :" + today);
//
LocalDateTime anotherDay = LocalDateTime.of(2008, Month.AUGUST, 8, 8, 8, 8);
System.out.println(" :" + anotherDay);
//
// , LocalDateTime
LocalDateTime thisTime = LocalTime.now().atDate(LocalDate.of(2008, 8, 8));
System.out.println(" :" + thisTime);
// , LocalDateTime
LocalDateTime thisDay = LocalDate.now().atTime(LocalTime.of(12, 24, 12));
System.out.println(" :" + thisDay);
// LocalDateTime
LocalDateTime thisDayAndTime = LocalDateTime.of(LocalDate.of(2008, 8, 8), LocalTime.of(12, 24, 12));
System.out.println(" :" + thisDayAndTime);
// LocalDate
LocalDate todayDate = today.toLocalDate();
System.out.println(" :" + todayDate);
// LocalTime
LocalTime todayTime = today.toLocalTime();
System.out.println(" :" + todayTime);
}
2.4
Instant
Instant
は、System.currentTimeMillis()
と同様のタイムスタンプを取得するために使用されるが、Instant
はナノ秒まで正確に使用することができる.public class InstantDemo {
public static void main(String[] args) {
// Instant
Instant instant = Instant.now();
// ofEpochSecond ( , )
Instant another = Instant.ofEpochSecond(365 * 24 * 60, 100);
//
long currentSecond = instant.getEpochSecond();
System.out.println(" :" + currentSecond);
//
long currentMilli = instant.toEpochMilli();
System.out.println(" :" + currentMilli);
}
}
2.5
Duration
Duration
の内部実装はInstant
と類似しているが、Duration
は期間を表し、between
メソッドによって作成され、of()
メソッドによって作成されてもよい.public static void duration() {
LocalDateTime from = LocalDateTime.now();
LocalDateTime to = LocalDateTime.now().plusDays(1);
// between()
Duration duration = Duration.between(from, to);
// of() , 。
// 7
Duration duration1 = Duration.of(7, ChronoUnit.DAYS);
// 60
Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);
}
2.5
Period
Period
はDuration
と同様に、1つの期間を取得しますが、単位は年月日です.of
メソッドとbetween
メソッドで作成することもできます.between
メソッドで受信したパラメータはLocalDate
です.private static void period() {
// of
Period period = Period.of(2012, 12, 24);
// between
Period period1 = Period.between(LocalDate.now(), LocalDate.of(2020,12,31));
}
三、時間操作
3.1時間比較
isBefore()
およびisAfter()
は、所定の時間または日付が別の時間/日付の前または後であるかを判断する.LocalDate
を例にとると、LocalDateTime
/LocalTime
と同様である.public static void compare() {
LocalDate thisDay = LocalDate.of(2008, 8, 8);
LocalDate otherDay = LocalDate.of(2018, 8, 8);
//
boolean isAfter = thisDay.isAfter(otherDay);
System.out.println(isAfter);
//
boolean isBefore = thisDay.isBefore(otherDay);
System.out.println(isBefore);
}
3.2年数、月数、日数の増加/減少
LocalDateTime
を例にとると、LocalDate
/LocalTime
と同様である.public static void plusAndMinus() {
//
LocalDateTime today = LocalDateTime.now();
LocalDateTime nextYearDay = today.plusYears(1);
System.out.println(" :" + nextYearDay);
LocalDateTime nextMonthDay = today.plus(1, ChronoUnit.MONTHS);
System.out.println(" :" + nextMonthDay);
//
LocalDateTime lastMonthDay = today.minusMonths(1);
LocalDateTime lastYearDay = today.minus(1, ChronoUnit.YEARS);
System.out.println(" :" + lastMonthDay);
System.out.println(" :" + lastYearDay);
}
3.3時間変更
with
による修正時間public static void edit() {
LocalDateTime today = LocalDateTime.now();
// 2012
LocalDateTime thisYearDay = today.withYear(2012);
System.out.println(" :" + thisYearDay);
// 12
LocalDateTime thisMonthDay = today.with(ChronoField.MONTH_OF_YEAR, 12);
System.out.println(" :" + thisMonthDay);
}
3.4時間計算
TemporalAdjusters
の静的方法とDuration
による時間の計算public static void compute() {
// TemporalAdjusters
LocalDate today = LocalDate.now();
//
LocalDate date = today.with(firstDayOfYear());
System.out.println(" :" + date);
// Duration
LocalDateTime from = LocalDateTime.now();
LocalDateTime to = LocalDateTime.now().plusMonths(1);
Duration duration = Duration.between(from, to);
//
//
long days = duration.toDays();
System.out.println(" " + days + " ");
//
long hours = duration.toHours();
System.out.println(" " + hours + " ");
//
long minutes = duration.toMinutes();
System.out.println(" " + minutes + " ");
}
TemporalAdjusters
のより多くの方法説明
dayOfWeekInMonth()
同じ月の週の日付を返します.
firstDayOfMonth()
当月の初日にもどる
firstDayOfNextMonth()
来月の初日に戻る
firstDayOfNextYear()
次の年の初日に戻る
firstDayOfYear()
本年の初日に戻る
firstInMonth()
同じ月の最初の曜日を返します.
lastDayOfMonth()
当月の最終日に戻る
lastDayOfNextMonth()
来月の最終日に戻る
lastDayOfNextYear()
次の年の最後の日に戻る
lastDayOfYear()
本年最後の日に戻る
lastInMonth()
同じ月の最後の曜日を返します
next()
/ previous()
次の/前の指定された曜日を返します.
nextOrSame()
/ previousOrSame()
次の曜日/前の曜日を返します.この値が条件を満たしている場合は、直接返します.
四、時間日付フォーマット
4.1フォーマット時間
DateTimeFormatter
のデフォルトでは、さまざまなフォーマットが提供されています.デフォルトでは、要件を満たすことができない場合は、DateTimeFormatter
のofPattern
メソッドでカスタムフォーマットを作成できます.public static void format() {
LocalDate today = LocalDate.now();
//
String todayStr1 = today.format(DateTimeFormatter.BASIC_ISO_DATE);
String todayStr2 = today.format(DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(" :" + todayStr1);
System.out.println(" :" + todayStr2);
//
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String todayStr3 = today.format(dateTimeFormatter);
System.out.println(" :" + todayStr3);
}
4.2解析時間
4.1でどのようにフォーマットするかは,ここで同様に解析する必要がある.
public static void parse() {
LocalDate date1 = LocalDate.parse("20080808", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2008-08-08", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(date1);
System.out.println(date2);
}
五、まとめ
Date
よりも優れていますInstant
の精度はより高く、ナノ秒レベルまで正確にすることができる.Duration
は時間帯内の日数、時間数などを簡単に得ることができる.LocalDateTime
年、月、日、来月などを迅速に取得できます.TemporalAdjusters
クラスには、ツールクラスを自分で作成することを避けるために、多くの一般的な静的方法が含まれています.Date
のフォーマット方式SimpleDateFormat
と比較して、DateTimeFormatter
はスレッドが安全である.5.1サンプルコード
Githubサンプルコード
5.2技術交流