Le temps doit être comparé dans le projet, et il existe environ deux types en JAVA, l'un est la classe Date avant JDK8 (généralement utilisée avec SimpleDateFormat) et diverses classes Zone sous le package time après JDK8.
Dans le projet actuel, les exigences sont les suivantes : accepter la chaîne envoyée depuis le front-end, l'analyser en classe temporelle, la stocker et la comparer.
Ce qui doit être convenu à l’avance, c’est le format horaire.
Dans swagger, vous pouvez voir que le format horaire de la demande d'échantillon est le suivant,
où T est le délimiteur et Z représente le temps universel coordonné. Dans l'armée, le fuseau horaire universel coordonné utilise « Z » pour représenter UTC (temps universel coordonné). UTC+8 est l’heure de Pékin dans le huitième district Est. Le point décimal après les secondes est utilisé pour séparer les millisecondes des secondes.
API traditionnelle : Date, SimpleDateFormat
Date lui-même n'a pas d'API liée à l'analyse, mais SimpleDateFormat offre une telle capacité, et Date lui-même implémente la fonction compareTo, qui peut être utilisée directement à des fins de comparaison.
Les paramètres du modèle de SimpleDateFormat sont les suivants :
- Identifiant de l'ère G
- année y
- M mois
- jour j
- h est le matin ou l'après-midi (1 ~ 12)
- Heure H dans la journée (0 ~ 23)
- m points
- s secondes
- S millisecondes
- Semaine E
- Jour J de l'année
- F Le jour de la semaine en janvier
- w Semaine de l'année
- Semaine W en janvier
- un marqueur AM/PM
- k heure dans la journée (1 ~ 24)
- L'heure K est le matin ou l'après-midi (0 ~ 11)
- Fuseau horaire z (CST)
- Fuseau horaire Z(+8:00)
De plus, vous pouvez également obtenir directement le nombre de millisecondes via System.currentTimeMillis().
L'exemple de code est le suivant :
// 毫秒数
System.out.println(System.currentTimeMillis()); // 1665660325997
// 2022-10-12T06:24:56.251Z 前端格式
String time1 = "2021-1-9 12:17:22";
// SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format1.parse(time1); //转换为Date类
System.out.println(date.getTime()); // getTime -> 毫秒数 1610165842000
System.out.println(format1.format(date)); // 2021-01-09 12:17:22
String time2 = "2022-10-12T06:24:56.251Z"; // "yyyy-MM-ddThh:mm:ss.SS"
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date date2 = format2.parse(time2); //转换为Date类
System.out.println(format2.format(date2)); // 2022-10-12T06:24:56.251Z
System.out.println(date.compareTo(new Date())); // -1
System.out.println(date.compareTo(date)); // 0
System.out.println(new Date().compareTo(date)); // 1
LocalXXX
La nouvelle API temporelle de jdk8 est livrée avec sa propre API d'analyse et sa propre API de comparaison, qui sont recommandées.
Il existe LocalTime, LocalDateTime et ZonedDateTime.
La principale utilisée est ZonedDateTime. Cette classe possède également plusieurs méthodes plus importantes.
- now() obtient l'heure actuelle
- withFixedOffsetZone() utilise un décalage et un fuseau horaire fixes
- isAfter() Si c'est après une certaine heure
Cet objet a deux paramètres de décalage et de fuseau horaire. À mesure que le fuseau horaire change, le décalage et l'heure changeront, mais la somme du décalage et du temps est fixe. Lorsque withFixedOffsetZone() n'est pas défini, le décalage par défaut est +8 et le fuseau horaire est Asie/Shanghai, mais une fois corrigé, ces deux variables deviennent Z, indiquant l'heure sans décalage. Les paramètres pertinents peuvent être visualisés via les fonctions suivantes : - getOffset()
- L'exemple de code pour getZone()
est le suivant :
System.out.println(LocalDate.now()); // 2022-10-13
System.out.println(LocalTime.now()); // 16:54:32.672
System.out.println(LocalDateTime.now()); // 2022-10-13T16:54:32.672
System.out.println(ZonedDateTime.now()); // 2022-10-13T16:54:32.672+08:00[Asia/Shanghai]
System.out.println(ZonedDateTime.now().withFixedOffsetZone()); // 2022-10-13T17:30:33.392+08:00
System.out.println(ZonedDateTime.now().getOffset()); // +08:00
System.out.println(ZonedDateTime.now().getZone()); // Asia/Shanghai
System.out.println(ZonedDateTime.parse("2022-10-12T06:24:56.251Z").withFixedOffsetZone()); // 2022-10-12T06:24:56.251Z
System.out.println(ZonedDateTime.parse("2022-10-12T06:24:56.251+08:00[Asia/Shanghai]")); // 2022-10-12T06:24:56.251+08:00[Asia/Shanghai]
ZonedDateTime time = ZonedDateTime.parse("2022-10-12T06:24:56.251Z").withFixedOffsetZone();
System.out.println(time); // 2022-10-12T06:24:56.251Z
System.out.println(time.isAfter(ZonedDateTime.now().withFixedOffsetZone())); // false
System.out.println(time.getOffset()); // Z
System.out.println(time.getZone()); // Z