web-dev-qa-db-fra.com

Différence entre Java HH: mm et hh: mm sur SimpleDateFormat

Quelle est la différence entre les formats kk: mm, HH: mm et hh: mm ??

    SimpleDateFormat broken = new SimpleDateFormat("kk:mm:ss");
    broken.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    SimpleDateFormat working = new SimpleDateFormat("HH:mm:ss");
    working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
    SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss");
    working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

    System.out.println(broken.format(Epoch));
    System.out.println(working.format(Epoch));
    System.out.println(working2.format(Epoch));

impressions:

24:00:00
00:00:00
05:30:00
41
user2527039

kk: (01-24) ressemblera à 01, 02..24.

HH: (00-23) ressemblera à 00, 01..23.

hh: (01-12 dans AM/PM) ressemblera à 01, 02..12.

la dernière impression (working2) est donc un peu bizarre. Il devrait dire 12:00:00 (Edit: si vous définissiez le fuseau horaire working2 et le format, lequel (comme kdagli l’a souligné), vous ne l’êtes pas) 

46
kamjagin

S'il vous plaît jeter un oeil ici

HH est heure dans une journée (à partir de 0 à 23)

hh sont des heures au format am/pm

kk est heure dans la journée (à partir de 1 à 24)

mm est minute en heure

ss sont les secondes dans une minute

16
peshkira

En fait, le dernier n'est pas étrange. Code définit le fuseau horaire pour travail au lieu de travail2.

SimpleDateFormat working2 = new SimpleDateFormat("hh:mm:ss");working.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

kk va de 1 à 24, HH de 0 à 23 et hh de 1 à 12 (AM/PM).

Corriger cette erreur donne:

24:00:00
00:00:00
01:00:00
16
kdagli

h/H = 12/24 heures signifie que vous écrirez hh: mm = format 12 heures et HH: mm = format 24 heures

0
Rohit Dodiya

Utilisez les formats localisés intégrés

Si vous voulez indiquer l’heure de la journée à un utilisateur, alors au moins 19 fois sur 20, vous ne devez pas vous soucier de kk, HH ni hh. Je suggère que vous utilisiez quelque chose comme ceci:

    DateTimeFormatter defaultTimeFormatter
            = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
    System.out.format("%s: %s%n",
            Locale.getDefault(), LocalTime.MIN.format(defaultTimeFormatter));

Le fait est que cela donne une sortie différente selon les paramètres régionaux par défaut. Par exemple:

en_SS: 12:00 AM
fr_BL: 00:00
ps_AF: 0:00
es_CO: 12:00 a.m.

Les formats localisés ont été conçus pour répondre aux attentes des différentes cultures. Ils offrent donc généralement une meilleure expérience à l'utilisateur et vous évitent d'écrire une chaîne de modèle de format, qui est toujours sujette aux erreurs.

De plus, je vous suggère de ne pas utiliser SimpleDateFormat. Cette classe est notoirement gênante et heureusement obsolète. Au lieu de cela, j'utilise Java.time, l'API de date et heure moderne de Java. C'est tellement plus agréable de travailler avec.

Quatre lettres types pour l'heure: H, h, k et K

Bien sûr, si vous avez besoin d’analyser une chaîne avec un format spécifié, et si vous avez des exigences de mise en forme très spécifiques, il est bon d’utiliser une chaîne de modèle de format. Il y a en fait quatre modèles de lettre différents parmi lesquels choisir par heure (cités dans la documentation):

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   h       clock-hour-of-am-pm (1-12)  number            12
   K       hour-of-am-pm (0-11)        number            0
   k       clock-hour-of-day (1-24)    number            24
   H       hour-of-day (0-23)          number            0

En pratique, H et h sont utilisés. Autant que je sache, k et K ne le sont pas (elles peuvent simplement avoir été incluses pour des raisons d'exhaustivité). Mais voyons-les tous en action:

    DateTimeFormatter timeFormatter
            = DateTimeFormatter.ofPattern("hh:mm a  HH:mm  kk:mm  KK:mm a", Locale.ENGLISH);
    System.out.println(LocalTime.of(0, 0).format(timeFormatter));
    System.out.println(LocalTime.of(1, 15).format(timeFormatter));
    System.out.println(LocalTime.of(11, 25).format(timeFormatter));
    System.out.println(LocalTime.of(12, 35).format(timeFormatter));
    System.out.println(LocalTime.of(13, 40).format(timeFormatter));
12:00 AM  00:00  24:00  00:00 AM
01:15 AM  01:15  01:15  01:15 AM
11:25 AM  11:25  11:25  11:25 AM
12:35 PM  12:35  12:35  00:35 PM
01:40 PM  13:40  13:40  01:40 PM

Si vous ne souhaitez pas que le zéro soit au début, indiquez simplement une lettre de modèle, soit h au lieu de hh ou H au lieu de HH. Il acceptera toujours deux chiffres lors de l'analyse et si un nombre à imprimer est supérieur à 9, deux chiffres seront toujours imprimés.

Liens

0
Ole V.V.