JustSystems Corporation strong> div>
Dans la question de cette session, on m'a demandé "Comment avez-vous trouvé ces 10?" Je le savais depuis le début, et je l'ai revu quand j'ai fait cette session, mais après tout, il est sobre de lire la source de l'API Java core ou d'essayer quelque chose. J'ai pensé.
Sujet du jour
En passant, récemment, je me suis soudainement intéressé à ce qui suit, alors je l'ai essayé.
Ecrire beaucoup de H
Nous avons reçu des réponses de trois personnes. Les opinions étaient partagées. Je pensais que c'était le deuxième.
Mais la réalité était différente.
En regardant la mise en œuvre de l'API principale, cela ressemble à ceci. (Extrait de la source 8u131)
java:DateTimeFormatterBuilder.java(LL.1793-1807)
case 'd':
case 'h':
case 'H':
case 'k':
case 'K':
case 'm':
case 's':
if (count == 1) {
appendValue(field);
} else if (count == 2) {
appendValue(field, count);
} else {
throw new IllegalArgumentException("Too many pattern letters: " + cur);
}
break;
Seuls 2 caractères sont acceptés, donc 3 caractères ou plus sont supprimés.
Alors est-ce que ça va s'il y a deux H? → Dans certains cas, une exception se produira
Le problème suivant est donc celui-ci.
Je pensais que c'était aussi le deuxième.
Mais la réalité était différente.
J'ai également vu la mise en œuvre.
java:Instant.java(LL.594-606)
@Override
public long getLong(TemporalField field) {
if (field instanceof ChronoField) {
switch ((ChronoField) field) {
case NANO_OF_SECOND: return nanos;
case MICRO_OF_SECOND: return nanos / 1000;
case MILLI_OF_SECOND: return nanos / 1000_000;
case INSTANT_SECONDS: return seconds;
}
throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
}
return field.getFrom(this);
}
Le HOUR_OF_DAY
que vous essayez d'obtenir cette fois est ChronoField
, donc ce qui précède
if (field instanceof ChronoField) {
Il est inclus dans cette instruction ʻifpour satisfaire cette condition. Et comme il n'y a pas de champ correspondant dans
switch`, cela signifie qu'il est éteint.
En d'autres termes, si vous voulez prendre du temps, vous devez avoir une instance d'une classe qui prend en charge HOUR_OF_DAY
telle que LocalDateTime
. Ce fut une expérience d'apprentissage.
appendice
Voici le code utilisé pour le test. Depuis que je l'ai écrit pour un usage personnel, il n'y a pas de commentaire, et c'est embarrassant de le faire d'une manière moins belle, comme basculer entre les deux tests sans commenter.
FormatterTest.java
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
*
*/
public class FormatterTest {
/**
*
* @param arguments
*/
public static void main(String[] arguments) {
//System.out.println(DateTimeFormatter.ofPattern("HH").format(Instant.now()));
System.out.println(DateTimeFormatter.ofPattern("HHHH").format(LocalDateTime.now()));
}
}