Table des matières
1. Présentation
2. Problèmes avec l'ancienne API (avant java8)
3. Utilisez LocalDate, LocalTime et LocalDateTime
3.1. Utiliser LocalDate
3.2. Utilisez LocalTime
3.3. Utilisation de LocalDateTime
4.使用ZonedDateTime API
5.使用Period和Duration
5.1.使用Period
5.2.使用Duration
6.与日期和日历的兼容性
7. 日期和时间格式化
8.替代方案
8.1.使用Threeten 类库
8.2.Joda-Time类库
Maison Java javaDidacticiel Comment utiliser l'API Java8 Time

Comment utiliser l'API Java8 Time

Apr 28, 2023 pm 12:25 PM
java api time

1. Présentation

Dans le cadre de cet article, commençons par quelques problèmes avec les API de date et de calendrier existantes et explorons comment les nouvelles API de date et d'heure Java 8 résolvent ces problèmes.

Nous examinerons également les classes principales de la bibliothèque de classes de temps Java 8, telles que LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Period, Duration et leurs API.

2. Problèmes avec l'ancienne API (avant java8)

  • Sécurité des threads - Les classes Date et Calendar ne sont pas thread-safe, ce qui rend difficile pour les développeurs de déboguer les problèmes de concurrence avec ces API et doivent écrire du code supplémentaire pour gérer la sécurité des fils. Les nouvelles API de date et d'heure introduites dans Java 8 sont immuables et thread-safe, permettant de résoudre ces problèmes.

  • Conception d'API et facile à comprendre - L'ancienne API est très difficile à comprendre, les opérations sont très complexes, très alambiquées et ne fournissent pas de méthodes d'analyse et de conversion courantes. La nouvelle API de temps est centrée sur ISO et suit un modèle de domaine cohérent pour la date, l'heure, la durée et les périodes. Certaines méthodes très utiles sont fournies pour prendre en charge les opérations les plus courantes. Nous n’avons plus besoin d’encapsuler nous-mêmes certaines classes d’opérations temporelles.

  • ZonedDate and Time - Dans l'ancienne API, les développeurs devaient écrire une logique supplémentaire pour gérer la logique de fuseau horaire de l'ancienne API, tandis qu'avec la nouvelle API, vous pouvez utiliser les API Local et ZonedDate/Time pour gérer les fuseaux horaires. Pas besoin de trop vous soucier de la conversion du fuseau horaire.

3. Utilisez LocalDate, LocalTime et LocalDateTime

Les classes les plus couramment utilisées sont LocalDate, LocalTime et LocalDateTime. Comme leur nom l'indique, ils représentent la date/heure locale combinée au contexte.

Ces classes sont principalement utilisées lorsque le fuseau horaire n'a pas besoin d'être explicitement spécifié dans le contexte. Dans le cadre de cette section, nous aborderons les API les plus couramment utilisées.

3.1. Utiliser LocalDate

LocalDate représente une date sans heure précise au format ISO (AAAA-MM-JJ).

Il est souvent utilisé pour exprimer les anniversaires ou les dates de salaire qui nous tiennent le plus à cœur.

Obtenez la date sous l'horloge système actuelle comme suit :

LocalDate localDate = LocalDate.now();
Copier après la connexion

Une LocalDate représentant un jour, un mois et une année spécifiques peut être obtenue en utilisant la méthode "of" ou en utilisant la méthode "parse". Par exemple, l'extrait de code suivant représente la LocalDate du 20 février 2015 :

LocalDate.of(2015, 02, 20);
LocalDate.parse("2015-02-20");
Copier après la connexion

N'est-ce pas très intuitif et pratique ! LocalDate fournit diverses méthodes utilitaires pour obtenir diverses informations sur la date. Jetons un coup d'œil rapide à ces méthodes API.

L'extrait de code suivant obtient la date locale actuelle et ajoute un jour :

LocalDate tomorrow = LocalDate.now().plusDays(1);
Copier après la connexion

Cet exemple obtient la date actuelle et soustrait un mois. Notez comment il accepte une énumération comme unité de temps :

LocalDate previousMonthSameDay = LocalDate.now().minus(1, ChronoUnit.MONTHS);
Copier après la connexion

Dans les deux exemples de code suivants, nous analysons la date "2016-06-12" et obtenons respectivement le jour de la semaine et le jour du mois. Faites attention à la valeur de retour. Le premier est un objet représentant DayOfWeek, et le second est un int représentant la valeur ordinale du mois :

DayOfWeek sunday = LocalDate.parse("2016-06-12").getDayOfWeek();
int twelve = LocalDate.parse("2016-06-12").getDayOfMonth();
Copier après la connexion

Nous pouvons tester si une date se produit dans une année bissextile. l'ancienne méthode, nous n'allons peut-être pas au paradis :

boolean leapYear = LocalDate.now().isLeapYear();
Copier après la connexion

Jugez l'ordre des dates :

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"));
Copier après la connexion

La limite de date peut être obtenue à partir de la date donnée. Dans les deux exemples suivants, nous obtenons un LocalDateTime qui représente le début de la journée pour une date donnée (2016-06-12T00:00) et un LocalDate qui représente le début du mois (2016-06-01) :

LocalDateTime beginningOfDay = LocalDate.parse("2016-06-12").atStartOfDay();
LocalDate firstDayOfMonth = LocalDate.parse("2016-06-12")
.with(TemporalAdjusters.firstDayOfMonth());
Copier après la connexion

Voyons maintenant comment nous utilisons l'heure locale.

3.2. Utilisez LocalTime

pour représenter l'heure sans date en heure locale.

Semblable à LocalDate, les instances LocalTime peuvent être créées à partir de l'horloge système ou en utilisant les méthodes "parse" et "of". Jetez un coup d’œil rapide à quelques API couramment utilisées ci-dessous.

Une instance de LocalTime actuelle peut être créée à partir de l'horloge système comme suit :

LocalTime now = LocalTime.now();
Copier après la connexion

Dans l'exemple de code suivant, nous créons une LocalTime représentant 06h30 en analysant la représentation sous forme de chaîne :

LocalTime sixThirty = LocalTime.parse("06:30");
Copier après la connexion

Méthode "de " Peut être utilisé pour créer LocalTime. Par exemple, le code ci-dessous utilise la méthode "of" pour créer un LocalTime représentant 06h30 :

LocalTime sixThirty = LocalTime.of(6, 30);
Copier après la connexion

L'exemple ci-dessous crée un LocalTime en analysant une chaîne et y ajoute une heure à l'aide de l'API "plus". Le résultat sera un LocalTime représentant 07h30 :

LocalTime sevenThirty = LocalTime.parse("06:30").plus(1, ChronoUnit.HOURS);
Copier après la connexion

Diverses méthodes de lecture peuvent être utilisées pour obtenir des unités de temps spécifiques telles que les heures, les minutes et les secondes. Obtenez l'heure comme suit :

int six = LocalTime.parse("06:30").getHour();
Copier après la connexion

Identique à LocalDate pour vérifier si un une heure spécifique est avant ou après une autre heure spécifique. L'exemple de code suivant compare deux LocalTimes qui donnent la valeur true :

boolean isbefore = LocalTime.parse("06:30").isBefore(LocalTime.parse("07:30"));
Copier après la connexion

Les heures maximale, minimale et midi de la journée peuvent être obtenues grâce aux constantes de la classe LocalTime. Ceci est utile lors de l'exécution de requêtes de base de données pour rechercher des enregistrements dans une plage de temps donnée. Par exemple, le code ci-dessous représente 23:59:59.99 :

LocalTime maxTime = LocalTime.MAX
Copier après la connexion

Examinons maintenant de plus près LocalDateTime.

3.3. Utilisation de LocalDateTime

Le LocalDateTime est utilisé pour représenter une combinaison de date et d'heure.

C'est la classe la plus couramment utilisée lorsque nous devons combiner la date et l'heure. Cette classe fournit diverses API et nous présenterons certaines des API les plus couramment utilisées.

Similaire à LocalDate et LocalTime Obtenez une instance de LocalDateTime à partir de l'horloge système :

LocalDateTime.now();
Copier après la connexion

下面的代码示例解释了如何使用工厂“of”和“parse”方法创建实例。结果将是代表2015年2月20日06:30 AM 的LocalDateTime实例:

LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
LocalDateTime.parse("2015-02-20T06:30:00");
Copier après la connexion

有一些实用的API可以支持特定时间单位的时间运算,例如天,月,年和分钟。以下代码示例演示了“加”和“减”方法的用法。这些API的行为与LocalDate和LocalTime中的 API完全相同:

localDateTime.plusDays(1);
localDateTime.minusHours(2);
Copier après la connexion

Getter方法可用于提取类似于日期和时间类的特定单位。鉴于上面的LocalDateTime实例,下面的代码示例将返回2月份的月份:

localDateTime.getMonth();
Copier après la connexion

4.使用ZonedDateTime API

当我们需要处理时区特定的日期和时间时,Java 8提供了ZonedDateTime 类。ZoneID是用于表示不同区域的标识符。大约有40个不同的时区,使用ZoneID表示它们,如下所示

下面的代码我们来获取下“亚洲/上海”时区:

ZoneId zoneId = ZoneId.of("Aisa/Shanghai");
Copier après la connexion

获取所有的时区:

Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
Copier après la connexion

LocalDateTime转化为特定的时区中的时间:

ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
Copier après la connexion

ZonedDateTime提供解析方法来获取时区的特定日期时间:

ZonedDateTime.parse("2015-05-03T10:15:30+01:00[Aisa/Shanghai]");
Copier après la connexion

使用时区的另一种方法是使用OffsetDateTime。OffsetDateTime是具有偏移量的日期时间的不可变表示形式。此类存储所有日期和时间字段,精确到纳秒,以及从UTC/格林威治的偏移量。可以使用ZoneOffset创建OffsetDateTime实例。这里我们创建一个LocalDateTime来表示2015年2月20日上午6:30:

LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
Copier après la connexion

然后我们通过创建ZoneOffset并为LocalDateTime实例设置来增加两个小时:

ZoneOffset offset = ZoneOffset.of("+02:00");
OffsetDateTime offSetByTwo = OffsetDateTime.of(localDateTime, offset);
Copier après la connexion

我们现在的本地日期时间为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));
Copier après la connexion

Period 类有各种getter方法,如getYears,getMonths和getDays从获取值周期对象。下面的代码示例返回一个int值为5,是基于上面示例的逆序操作:

int five = Period.between(finalDate, initialDate).getDays();
Copier après la connexion

该Period 可以在特定的单元获得两个日期之间的如天或月或数年,使用ChronoUnit.between:

int five = ChronoUnit.DAYS.between(finalDate , initialDate);
Copier après la connexion

此代码示例返回五天。让我们继续看看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));
Copier après la connexion

两个时刻之间的持续时间可以作为持续时间或作为特定单位获得。在第一个代码片段中,我们使用Duration类的between()方法来查找finalTime和initialTime之间的时间差,并以秒为单位返回差异:

int thirty = Duration.between(finalTime, initialTime).getSeconds();
Copier après la connexion

在第二个例子中,我们使用ChronoUnit类的between()方法来执行相同的操作:

int thirty = ChronoUnit.SECONDS.between(finalTime, initialTime);
Copier après la connexion

现在我们来看看如何将旧的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());
Copier après la connexion

所述LocalDateTime可以从如下“ofEpochSecond"方法来构造。以下代码的结果将是代表2016-06-13T11:34:50 的LocalDateTime:

LocalDateTime.ofEpochSecond(1465817690, 0, ZoneOffset.UTC);
Copier après la connexion

现在让我们继续进行日期和时间格式化。

7. 日期和时间格式化

Java 8提供了用于轻松格式化日期和时间的 API :

LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
Copier après la connexion

以下代码传递ISO日期格式以格式化本地日期。结果将是2015-01-25:

String localDateString = localDateTime.format(DateTimeFormatter.ISO_DATE);
Copier après la connexion

该DateTimeFormatter提供多种标准格式选项。也可以提供自定义模式来格式化方法,如下所示,它将返回LocalDate为2015/01/25:

localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
Copier après la connexion

我们可以将格式样式传递为SHORT,LONG或MEDIUM作为格式化选项的一部分。

下面的代码示例输出2015年1月25日06:30:00 me的输:

localDateTime
.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.UK);
Copier après la connexion

最后让我们看看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>
Copier après la connexion

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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

See all articles