Java8 Time APIの使い方
1. 概要
この記事の一部として、既存の日付 API とカレンダー API に関するいくつかの問題から始めて、新しい Java 8 日付 API がこれらの問題をどのように解決するかを探ってみましょう。
Java 8 時間クラス ライブラリのコア クラス (LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Period、Duration など) とその API についても見ていきます。
2. 古い API (java8 より前) の問題
スレッド セーフ - Date クラスと Calendar クラスはスレッド セーフではないため、開発者がデバッグするのが困難ですこれらの API の同時実行の問題では、スレッド セーフを処理するために追加のコードを作成する必要があります。 Java 8 で導入された新しい日付と時刻の API は不変でスレッドセーフであるため、これらの問題点を解決できます。
API の設計と理解しやすさ - 昔の API は理解するのが非常に難しく、操作が非常に複雑で複雑で、一般的に使用されるいくつかの解析方法や変換方法が提供されていません。新しい時刻 API は ISO 中心であり、日付、時刻、期間、期間に関して一貫したドメイン モデルに従います。最も一般的な操作をサポートするために、非常に便利なメソッドがいくつか提供されています。一部の時間操作クラスを自分でカプセル化する必要はなくなりました。
ZonedDate と Time - 以前の API 開発者は、古い API のタイム ゾーン ロジックを処理するために追加のロジックを作成する必要がありましたが、新しい API では、Local および ZonedDate / Time を使用できます。タイムゾーンを処理するために API を使用します。タイムゾーンの変換についてあまり心配する必要はありません。
3. LocalDate、LocalTime、および LocalDateTime を使用する
最も一般的に使用されるクラスは、LocalDate、LocalTime、および LocalDateTime です。名前が示すように、ローカルの日付/時刻をコンテキストと組み合わせて表します。
これらのクラスは、主にコンテキスト内でタイム ゾーンを明示的に指定する必要がない場合に使用されます。このセクションの一部として、最も一般的に使用される API について説明します。
3.1. LocalDate の使用
LocalDate は、ISO 形式 (YYYY-MM-DD) で特定の時刻を含まない日付を表します。
は、誕生日や最も気になる給与日を表すためによく使用されます。
次のように、現在のシステム クロックで日付を取得します。
LocalDate localDate = LocalDate.now();
LocalDate 特定の日、月、年を表すには、「 of 」メソッドを使用するか、「」を使用します。 parse 」メソッドを取得します。たとえば、次のコード スニペットは 2015 年 2 月 20 日の LocalDate を表します:
LocalDate.of(2015, 02, 20); LocalDate.parse("2015-02-20");
非常に直感的で便利ではないでしょうか。 LocalDate は、さまざまな日付情報を取得するためのさまざまなユーティリティ メソッドを提供します。これらの API メソッドを簡単に見てみましょう。
次のコード スニペットは、現在のローカル日付を取得し、1 日を加算します。
LocalDate tomorrow = LocalDate.now().plusDays(1);
この例では、現在の日付を取得し、1 か月を減算します。 enum を時間単位として受け入れる方法に注目してください:
LocalDate previousMonthSameDay = LocalDate.now().minus(1, ChronoUnit.MONTHS);
次の 2 つのコード例では、日付「2016-06-12」を解析し、それぞれ曜日と月の日を取得します。戻り値に注意してください。最初の値は DayOfWeek を表すオブジェクトで、2 番目の値は月の序数値を表す int です:
DayOfWeek sunday = LocalDate.parse("2016-06-12").getDayOfWeek(); int twelve = LocalDate.parse("2016-06-12").getDayOfMonth();
日付が次の形式で出現するかどうかをテストできます。閏年です。古い方法を使用すると、残念ながら天国に行かないでしょう:
boolean leapYear = LocalDate.now().isLeapYear();
日付の順序を決定します:
boolean notBefore = LocalDate.parse("2016-06-12").isBefore(LocalDate.parse("2016-06-11")); boolean isAfter = LocalDate.parse("2016-06-12").isAfter(LocalDate.parse("2016-06-11"));
日付境界は指定された日付から取得できます。次の 2 つの例では、指定された日付 (2016-06-12T00:00) の 1 日の始まりを表す LocalDateTime と、月の初め (2016-06-01) を表す LocalDate を取得します。
LocalDateTime beginningOfDay = LocalDate.parse("2016-06-12").atStartOfDay(); LocalDate firstDayOfMonth = LocalDate.parse("2016-06-12") .with(TemporalAdjusters.firstDayOfMonth());
現在の LocalTime のインスタンスは、次のようにシステム クロックから作成できます:
LocalTime now = LocalTime.now();
LocalTime sixThirty = LocalTime.parse("06:30");
LocalTime sixThirty = LocalTime.of(6, 30);
LocalTime sevenThirty = LocalTime.parse("06:30").plus(1, ChronoUnit.HOURS);
int six = LocalTime.parse("06:30").getHour();
boolean isbefore = LocalTime.parse("06:30").isBefore(LocalTime.parse("07:30"));
LocalTime maxTime = LocalTime.MAX
LocalDateTime.now();
下面的代码示例解释了如何使用工厂“of”和“parse”方法创建实例。结果将是代表2015年2月20日06:30 AM 的LocalDateTime实例:
LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30); LocalDateTime.parse("2015-02-20T06:30:00");
有一些实用的API可以支持特定时间单位的时间运算,例如天,月,年和分钟。以下代码示例演示了“加”和“减”方法的用法。这些API的行为与LocalDate和LocalTime中的 API完全相同:
localDateTime.plusDays(1); localDateTime.minusHours(2);
Getter方法可用于提取类似于日期和时间类的特定单位。鉴于上面的LocalDateTime实例,下面的代码示例将返回2月份的月份:
localDateTime.getMonth();
4.使用ZonedDateTime API
当我们需要处理时区特定的日期和时间时,Java 8提供了ZonedDateTime 类。ZoneID是用于表示不同区域的标识符。大约有40个不同的时区,使用ZoneID表示它们,如下所示
下面的代码我们来获取下“亚洲/上海”时区:
ZoneId zoneId = ZoneId.of("Aisa/Shanghai");
获取所有的时区:
Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
LocalDateTime转化为特定的时区中的时间:
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
ZonedDateTime提供解析方法来获取时区的特定日期时间:
ZonedDateTime.parse("2015-05-03T10:15:30+01:00[Aisa/Shanghai]");
使用时区的另一种方法是使用OffsetDateTime。OffsetDateTime是具有偏移量的日期时间的不可变表示形式。此类存储所有日期和时间字段,精确到纳秒,以及从UTC/格林威治的偏移量。可以使用ZoneOffset创建OffsetDateTime实例。这里我们创建一个LocalDateTime来表示2015年2月20日上午6:30:
LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
然后我们通过创建ZoneOffset并为LocalDateTime实例设置来增加两个小时:
ZoneOffset offset = ZoneOffset.of("+02:00"); OffsetDateTime offSetByTwo = OffsetDateTime.of(localDateTime, offset);
我们现在的本地日期时间为2015-02-20 06:30 +02:00。现在让我们继续讨论如何使用Period和Duration类修改日期和时间值。
5.使用Period和Duration
Period : 用于计算两个日期(年月日)间隔。
Duration : 用于计算两个时间(秒,纳秒)间隔。
5.1.使用Period
Period 类被广泛地用于修改给定的日期的值或者获取两个日期之间的差值:
LocalDate initialDate = LocalDate.parse("2007-05-10"); LocalDate finalDate = initialDate.plus(Period.ofDays(5));
Period 类有各种getter方法,如getYears,getMonths和getDays从获取值周期对象。下面的代码示例返回一个int值为5,是基于上面示例的逆序操作:
int five = Period.between(finalDate, initialDate).getDays();
该Period 可以在特定的单元获得两个日期之间的如天或月或数年,使用ChronoUnit.between:
int five = ChronoUnit.DAYS.between(finalDate , initialDate);
此代码示例返回五天。让我们继续看看Duration类。
5.2.使用Duration
类似Period ,该Duration类是用来处理时间。在下面的代码中,我们创建一个本地时间上午6:30,然后加30秒的持续时间,以使本地时间上午6时三十〇分30秒的:
LocalTime initialTime = LocalTime.of(6, 30, 0); LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
两个时刻之间的持续时间可以作为持续时间或作为特定单位获得。在第一个代码片段中,我们使用Duration类的between()方法来查找finalTime和initialTime之间的时间差,并以秒为单位返回差异:
int thirty = Duration.between(finalTime, initialTime).getSeconds();
在第二个例子中,我们使用ChronoUnit类的between()方法来执行相同的操作:
int thirty = ChronoUnit.SECONDS.between(finalTime, initialTime);
现在我们来看看如何将旧的Date 和Calendar 转换为新的Date和Time。
6.与日期和日历的兼容性
Java 8添加了toInstant()方法,该方法有助于将旧API中的Date和Calendar实例转换为新的Date Time API,如下面的代码片段所示:
LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
所述LocalDateTime可以从如下“ofEpochSecond"方法来构造。以下代码的结果将是代表2016-06-13T11:34:50 的LocalDateTime:
LocalDateTime.ofEpochSecond(1465817690, 0, ZoneOffset.UTC);
现在让我们继续进行日期和时间格式化。
7. 日期和时间格式化
Java 8提供了用于轻松格式化日期和时间的 API :
LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
以下代码传递ISO日期格式以格式化本地日期。结果将是2015-01-25:
String localDateString = localDateTime.format(DateTimeFormatter.ISO_DATE);
该DateTimeFormatter提供多种标准格式选项。也可以提供自定义模式来格式化方法,如下所示,它将返回LocalDate为2015/01/25:
localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
我们可以将格式样式传递为SHORT,LONG或MEDIUM作为格式化选项的一部分。
下面的代码示例输出2015年1月25日06:30:00 me的输:
localDateTime .format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) .withLocale(Locale.UK);
最后让我们看看Java 8 Core Date / Time API 可用的替代方案。
8.替代方案
8.1.使用Threeten 类库
对于从Java 7或Java 6这些老项目来说可以使用Threeten ,然后可以像在上面java 8一样使用相同的功能,一旦你迁移到java 8 只需要修改你的包路径代码而无需变更:
<dependency> <groupId>org.threeten</groupId> <artifactId>threetenbp</artifactId> <version>LATEST</version> </dependency>
8.2.Joda-Time类库
Java 8 日期和时间库的另一种替代方案是Joda-Time库。事实上,Java 8 Date Time API由Joda-Time库(Stephen Colebourne)和Oracle共同领导。该库提供了Java 8 Date Time项目中支持的几乎所有功能。通过在项目中引用以下pom依赖项就可以立即使用:
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>LATEST</version> </dependency>
以上がJava8 Time APIの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
