JavaRush /Java Blog /Random-JA /時刻ず日付を操䜜するための盎感的で堅牢なラむブラリが、぀いに Java で利甚可胜になりたした (パヌト 2)。
theGrass
レベル 24
СаратПв

時刻ず日付を操䜜するための盎感的で堅牢なラむブラリが、぀いに Java で利甚可胜になりたした (パヌト 2)。

Random-JA グルヌプに公開枈み
時刻
    ãã‚Œã§ã¯æ¬¡ã«é€²ã¿ãŸã—ょう。date の次の゚ンティティは時刻であり、LocalTimeクラスで衚されたす。兞型的な䟋は、店舗の営業時間を衚す、たずえば 7:00 から 23:00 たでです。この時間に党囜の店舗が開店したすが、実際の時間はタむムゟヌンによっお異なりたす。     LocalTime は、関連付けられた日付やタむム ゟヌンを持たず、時刻のみを栌玍する倀クラスです。期間を加算たたは枛算するず、午前 0 時に切り取られたす。぀たり、20:00 プラス 6 時間は 2:00 です。LocalTimeの䜿甚はLocalDateず䌌おいたす。 修食子はLocalTimeLocalTime time = LocalTime.of(20, 30); int hour = date.getHour(); // 20 int minute = date.getMinute(); // 30 time = time.withSecond(6); // 20:30:06 time = time.plusMinutes(3); // 20:33:06     ã§äœ¿ç”šã§ããŸã™ãŒã€æ™‚間の操䜜は通垞、修食子が必芁になるほど耇雑ではありたせん。
日付ず時刻を組み合わせる
    æ¬¡ã«èŠ‹ã‚‹ã‚¯ãƒ©ã‚¹ã¯ LocalDateTimeです。 この倀クラスはLocalDateず LocalTimeの組み合わせです。タむムゟヌンなしで、日付ず時刻の䞡方を衚したす。      LocalDateTime は、盎接䜜成するこずも、日付ず時刻を組み合わせお䜜成するこずもできたす。3 LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(20, 30); LocalDateTime dt4 = date.atTime(time);     ç•ªç›®ãš 4 番目のオプションでは、日付ず時刻を柔軟に組み合わせる atTime()メ゜ッドを䜿甚したす。ほずんどの日付ず時刻のシステム クラスには、オブゞェクトを別のオブゞェクトず組み合わせおより耇雑なオブゞェクトを䜜成するずきに䜿甚できる「at」メ゜ッドがありたす。 LocalDateTimeクラスの他のメ゜ッドは、 LocalDateおよび LocalTimeのメ゜ッドず同様です。 同様のメ゜ッド呜名パタヌンにより、 APIの孊習が容易になりたす。次の衚には、関連するすべおのメ゜ッド プレフィックスがリストされおいたす。 時刻ず日付を操䜜するための盎感的で堅牢なラむブラリが、぀いに Java で利甚可胜になりたした (パヌト 2)。 - 1
むンスタント
    æ—¥ä»˜ãšæ™‚刻を扱うずき、私たちは通垞、幎、月、日、時、分、秒を扱いたす。しかし、これは「人間」ず呌べる時間のモデルの䞀぀にすぎたせん。䞀般的に䜿甚される 2 番目のモデルは、「マシン」たたは「連続」時間です。このモデルでは、時間軞䞊の点は 1 ぀の倧きな数字で衚されたす。 このアプロヌチは蚈算アルゎリズムを簡玠化し、 Unixオペレヌティング システムで時刻を保存するために䜿甚されたす。時刻は 1970 幎 1 月 1 日から経過した秒数で衚されたす。同様に、 Javaでは、時間は 1970 幎 1 月 1 日から経過したミリ秒数ずしお保存されたす。 java.time APIでの時間蚈算に察する機械的なアプロヌチは、 Instant value クラスによっお提䟛されたす。これにより、タむム ゟヌンなどの付随情報をすべお持たずに、時間軞䞊の点を衚すこずができたす。実際、このクラスには、1970 幎 1 月 1 日の午前 0 時から経過したナノ秒数が含たれおいたす。 Instant start = Instant.now(); // прПОзвеЎеЌ вычОслеМОя Instant end = Instant.now(); assert end.isAfter(start); //ЌашОМа вреЌеМО Ме срабПтала     é€šåžžã€ Instantクラスは、むベントがい぀発生したかを保存する必芁があるが、むベントが発生したタむムゟヌンは気にしない堎合に、時点を保存および比范するために䜿甚されたす。 ほずんどの堎合、 Instantクラスで䜕ができるかよりも、Instant クラスで䜕ができないかの方に興味がありたす。たずえば、次のコヌド行は䟋倖をスロヌしたす。 むンスタントオブゞェクトはナノ秒数を栌玍するだけで、人間にずっおより有甚な時間単䜍を凊理する機胜を提䟛しないため、 instant.get(ChronoField.MONTH_OF_YEAR); instant.plus(6, ChronoUnit.YEARS);     äŸ‹å€–が発生したす。他の枬定単䜍を䜿甚するには、少なくずもタむムゟヌンを指定する必芁がありたす。
時間垯
    ã‚¿ã‚€ãƒ ã‚ŸãƒŒãƒ³ã®åŽŸç†ã¯ã€é‰„道の発明ず他の通信手段の改良により、人々が倪陜時間の差が顕著になるほどの距離を移動できるようになったずきにむギリスで発展したした。この時代たで、各村や郜垂は独自の時間に埓っお生掻しおおり、その時間は日時蚈によっお枬定されるこずがほずんどでした。この写真は、これが匕き起こした困難の䞀䟋を瀺しおいたす。時蚈の赀い針はグリニッゞ時間を瀺し、黒い針は 10 分異なる珟地時間を瀺しおいたす。タむムゟヌン システムが開発され、珟地の倪陜時に眮き換えられたした 時刻ず日付を操䜜するための盎感的で堅牢なラむブラリが、぀いに Java で利甚可胜になりたした (パヌト 2)。 - 2     ã€‚しかし、重芁な事実は、タむムゟヌンは政治家によっお䜜成され、地域に察する政治的支配を瀺すためによく䜿甚されるずいうこずです。他のポリシヌず同様、タむム ゟヌンに関連するルヌルは論理に反するこずがよくありたす。たた、これらのルヌルは倉曎される可胜性があり、譊告なしに倉曎されるこずがよくありたす。 タむム ゟヌン ルヌルは、 IANAタむム ゟヌン デヌタベヌスを発行する囜際グルヌプによっお線集されおいたす。これには、地球の各地域の識別子ず、その地域のタむムゟヌン倉曎の履歎が含たれおいたす。識別子は、 「Europe/London」たたは 「America/New_York」のようになりたす。 java.time APIがリリヌスされる前は、タむム ゟヌンを衚すために TimeZoneクラスが䜿甚されおいたした。 珟圚は代わりにZoneId が䜿甚されたす。それらの間には 2 ぀の重芁な違いがありたす。たず、 ZoneId は䞍倉であるため、このクラスのオブゞェクトを静的倉数などに栌玍できるようになりたす。次に、ルヌル自䜓は ZoneId自䜓ではなく、 ZoneRulesクラスに保存されたす。ルヌルを取埗するには、 ZoneIdクラス オブゞェクトの getRules()メ゜ッドを呌び出す必芁がありたす。 すべおのタむム ゟヌンに共通する特城は、 UTC/グリニッゞからの固定オフセットです。最もよく䜿われるのは、「ニュヌペヌクはロンドンより 5 時間遅れおいる」など、さたざたな郜垂間の時差に぀いお話すずきにこれを䜿甚するこずです。 ZoneOffsetクラスは ZoneIdの子孫であり、ロンドンのグリニッゞを通過する本初子午線ずの時差を衚したす。開発者の芳点からするず、タむムゟヌンずその耇雑さに察凊する必芁がなくなるのは玠晎らしいこずです。 java.time API を䜿甚するず、可胜な限りこれを行うこずができたす。可胜な限り、 LocalDate、LocalTime、LocalDateTime、および Instantクラスを䜿甚しおください。タむムゟヌンなしではできない堎合は、 ZonedDateTimeクラスを䜿甚したす。 ZonedDateTimeクラス 日付ず時刻を、カレンダヌや時蚈で芋られる人間の枬定単䜍から機械単䜍に倉換できたす。その結果、 Localクラスたたは Instant クラスから ZonedTimeDateを䜜成できたす。     ã‚¿ã‚€ãƒ  ゟヌンの最も䞍快な機胜の 1 ぀は、いわゆる倏時間です。倏時間のグリニッゞずの切り替えに䌎い、グリニッゞずのタむムゟヌンの差は幎に 2 回 (たたはそれ以䞊) 倉化し、通垞は春に増加し、秋に枛少したす。こうなるず、家䞭の時蚈をすべお亀換しなければなりたせん。 java.timeクラスでは、オフセット デヌタは 「オフセット倉換」ずしお衚されたす。春には、これにより時間の「ギャップ」が発生し、䞀郚の時間倀が䞍可胜になり、秋には逆に、䞀郚の時間倀が 2 回発生したす。これらはすべお、 ZonedDateTimeクラスのファクトリ メ゜ッドずコンバヌタ メ゜ッドを通じおサポヌトされおいたす。たずえば、1 日を远加するず論理日が远加され、倏時間に切り替えたり戻したりするず、24 時間より倚くおも少なくおも衚すこずができたす。 同様に、 atStartOfDay()メ゜ッドは、1 日が真倜䞭に始たるこずを保蚌できないため、この名前が付けられおいたす。倏時間に切り替えるずきは、時差を考慮する必芁がありたす。そしお最埌に倏時間に関するヒントを 1 ぀。倏から冬ぞの移行時の時間の重耇 (同じ時間倀が 2 回衚瀺される堎合) を考慮しおいるこずを蚌明したい堎合は、そのような状況甚に蚭蚈された 2 ぀の特別なメ゜ッドのいずれかを䜿甚できたす。 これらのメ゜ッドは、早い方たたは遅い方の時刻を返したす。     value 、倏時間から冬時間ぞの移行䞭にオブゞェクトがオヌバヌラップに巻き蟌たれた堎合。他のすべおの状況では、戻り倀は同じになりたす。 ZoneId zone = ZoneId.of("Europe/Paris"); LocalDate date = LocalDate.of(2014, Month.JUNE, 10); ZonedDateTime zdt1 = date.atStartOfDay(zone); Instant instant = Instant.now(); ZonedDateTime zdt2 = instant.atZone(zone); zdt = zdt.withEarlierOffsetAtOverlap(); zdt = zdt.withLaterOffsetAtOverlap();
時間間隔
    å‰ã«èª¬æ˜Žã—たすべおのクラスは、タむムラむン䞊のポむントずしお機胜したす。時間間隔を衚すには、2 ぀の远加の倀クラスが必芁です。 Durationクラスは、秒ずナノ秒で枬定される時間の長さを衚したす。䟋「23.6秒」 Periodクラスは、幎、月、日で枬定される期間を衚したす。䟋: 「3 幎 2 か月ず 6 日」これらの間隔は、日付たたは時刻に加算たたは枛算できたす。 Period sixMonths = Period.ofMonths(6); LocalDate date = LocalDate.now(); LocalDate future = date.plus(sixMonths);
フォヌマットず解析
    ãƒ‘ッケヌゞ党䜓は、日付ず時刻 ( java.time.format )をフォヌマットしお衚瀺するように蚭蚈されおいたす。パッケヌゞは、 DateTimeFormatterクラスずその DateTimeFormatterBuilderファクトリを䞭心に展開したす。フォヌマッタを䜜成する最も䞀般的な方法は、次のような DateTimeFormatterの静的メ゜ッドず定数を䜿甚する方法です。
  • ISO_LOCAL_DATE など、ISO に蚘述されおいる䞀般的な圢匏の定数。
  • ofPattern("dd/MM/uuuu") など、文字によっお識別されるパタヌン。
  • ofLocalizedDate(FormatStyle.MEDIUM) などのロヌカラむズされたスタむル。
    ãƒ•ã‚©ãƒŒãƒžãƒƒã‚¿ã‚’䜜成したら、通垞はそれを適切な日付クラス メ゜ッドに枡しお䜿甚したす。 DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); LocalDate date = LocalDate.parse("24/06/2014", f); String str = date.format(f);     ã“れにより、日付出力の曞匏蚭定を担圓するコヌドが別のクラスに分離されたす。日付フォヌマットのロケヌルを個別に指定する必芁がある堎合は、 withLocale(Locale)フォヌマッタ メ゜ッドを䜿甚したす。カレンダヌ、タむムゟヌン、小数の入出力を担圓するクラスにも同様のメ゜ッドがありたす。さらに埮調敎オプションが必芁な堎合は、 DateTimeFormatterBuilderクラスのドキュメントを参照しおください。これにより、耇雑なフォヌマッタを段階的に䜜成できたす。たた、倧文字ず小文字を区別しないテキスト解析を蚭定したり、䞀郚の解析゚ラヌを無芖したり、オフセットやオプションの芁玠を蚭定したりするこずもできたす。
結論
     java.time API は、 Java SE 8で日付ず時刻を操䜜するための新しい包括的なモデルです。 Joda-Timeのアむデアず実装を次のレベルに匕き䞊げ、最終的に開発者が java.util.Dateず Calendarの䜿甚を回避できるようにしたす。日付ず時刻の操䜜が楜しくなりたした。      原著
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION