Depuis la sortie de Java 8 en 2014, notre ancien java.util.date n'est enfin plus le seul choix pour les dates et le temps de fonctionnement à Java.
En fait, les API connexes de la date et de l'heure à Java ont toujours été critiquées par le monde. Non seulement c'est non seulement parce que sa division de conception n'est pas claire, mais qu'elle peut souvent gérer à la fois les dates et le temps, ce qui est très déroutant. Les mappages numériques de certaines années, mois et dates numériques sont également stockés contre les humains, tels que: 0 correspond au mois janvier, 11 correspond au mois décembre 118 correspond à l'année 2018 (1900 + 118), etc.
Souvent, lorsque nous obtenons une certaine valeur d'année et de mois, nous devons effectuer des opérations correspondantes pour obtenir des informations précises d'année, de mois et de date. Jusqu'à notre Java 8, nous avons emprunté l'excellente conception de la bibliothèque open source tiers Joda-Time et redessiné une API de date et d'heure. Par rapport à la précédente, on peut dire qu'il est cent fois plus facile à utiliser. Toutes les interfaces API associées sont situées dans le package java.time.
Interface de date et d'heure ancienne
Date représentant les informations de temps
Tous les ordinateurs du monde utilisent un entier de type long, et la valeur de cet entier est le nombre de millisecondes par rapport à GMT au Royaume-Uni (0: 0: 00, 1er janvier 1970). Par exemple:
public static void Main (String [] args) {// 1er janvier 1970 00:00:00 GMT. Date de date = nouvelle date (1000); System.out.println (date);}Résultat de sortie:
// 1970-1-1 8: 00: 01thu 01 08:00:01 CST 1970
Beaucoup de gens peuvent se demander, 1000 signifie 1 seconde avant l'heure standard, alors pourquoi le temps passe-t-il huit heures de plus?
Cela a quelque chose à voir avec le "fuseau horaire". Si vous êtes situé à Greenwich, le résultat sera comme prévu, mais nous sommes situés dans le huitième district est de la Chine, et le temps est huit heures plus tôt, donc les valeurs de base basées sur des fuseaux horaires différents sont différents.
Le cours de date a vraiment joué de nombreux rôles auparavant. On peut voir à partir de son code source selon lequel il existe des méthodes qui peuvent faire fonctionner le temps, des méthodes qui peuvent fonctionner l'année, mois et jour, et même gérer des fuseaux horaires. On peut dire qu'il suffit de l'avoir sur les seuls opérations liées à la date et à l'heure.
Mais c'est le monde. Si vous vous souciez trop, vous ne pourrez naturellement pas tout couvrir. La conception de nombreuses méthodes à la date n'est pas très raisonnable. Nous l'avons également dit auparavant, et c'est même un peu anti-humain. Par conséquent, près de 80% des méthodes de la classe de date actuelle ont été abandonnées et sont marquées @Deprecated.
Le positionnement actuel de Sun Company pour la date est de représenter un moment seulement, de sorte que sa position interne devrait tourner autour des millisecondes de cet entier, et ne plus se concentrer sur divers fuseaux horaires annuels et autres informations.
La date permet à un objet d'être instancié via deux constructeurs:
TRANSIGNAGE PRIVÉ LONGT TELLE; PUBLIC DATE () {this (System.CurrentTimeMillis ());} Public Date (Date longue) {Fast Time = Date;}L'attribut à temps rapide stocke ici le nombre de millisecondes correspondant à l'heure. Les deux constructeurs sont encore très simples. Si le constructeur sans paramètre est appelé, la machine virtuelle attribuera à temps rapide avec la valeur d'heure actuelle du système.
Il existe quelques autres méthodes qui n'ont pas été jetées:
Il existe deux autres méthodes qui sont nouvellement ajoutées à JDK1.8 par la suite, et sont utilisées pour convertir de nouvelles interfaces en Java 8, qui seront introduites plus tard.
Calendrier décrivant l'almanach
Le calendrier est utilisé pour représenter des informations de date telles que l'année, le mois, le jour, etc. Il s'agit d'une classe abstraite, donc son objet d'instance est généralement obtenu par les quatre méthodes d'usine suivantes.
Calendrier statique public GetInstance () Calendrier statique public GetInstance (Zone de fuseau horaire) Calendrier statique public GetInstance (Locale Alocale) Calendrier statique public GetInstance (Zone de fuseau horaire, Locale Alocale)
En fait, la même méthode interne sera finalement appelée:
Calendrier statique privé CreateCalendar (Zone du Zone Timezone, Locale Alocale)
Cette méthode nécessite deux paramètres, l'un est le fuseau horaire et l'autre est le pays et la langue. C'est-à-dire que la construction d'une instance de calendrier nécessite au moins ces deux informations de paramètres, sinon le fuseau horaire par défaut du système ou les informations linguistiques seront utilisés.
Étant donné que différents fuseaux horaires et langues nationales se produisent différemment pour les informations de temps et d'année, de mois et de jour, c'est également une raison pour laquelle une instance de calendrier doit passer des informations de fuseau horaire et de pays. Voir un exemple:
public static void main (String [] args) {calendar calendar = calendar.getInstance (); System.out.println (calendar.getTime ()); Calendar Calendar1 = Calendar.getInstance (timezone.getTimeZone ("GMT"), Locale.English); System.out.println (calendar1.get (calendar.year) + ":" + calendar1.get (calendar.hour) + ":" + calendar1.get (calendar.Minute)); }Résultat de sortie:
Sat 21 avril 10:32:20 CST 20182018: 2: 32
Comme vous pouvez le voir, la première sortie est l'heure actuelle du fuseau horaire par défaut de notre système et du pays, et le deuxième instance de calendrier que nous avons spécifié qu'il est situé dans le fuseau horaire de Greenwich (0 fuseau horaire), et le résultat est également évident, avec une différence de huit heures, car nous sommes situés dans le huitième est, qui est huit heures plus tôt que le fuseau horaire 0.
Certaines personnes peuvent se demander pourquoi la sortie de l'instance du deuxième calendrier est si compliquée à épisser, plutôt que d'appeler la méthode GetTime directement concise comme la première instance de calendrier?
Cela implique la mise en œuvre interne du calendrier, jetons un coup d'œil:
protégé longtemps; public final date gettime () {return new Date (gettimeInmillis ());}Comme la date, le calendrier maintient une information de temps à l'intérieur, et la méthode GetTime construit en fait un objet de date basé sur cette heure et renvoie.
Généralement, lorsque nous construisons une instance de calendrier, nous ne passerons pas dans une information temporelle, donc lorsque l'instance est initialisée, le programme calculera un numéro de milliseconde en fonction du fuseau horaire par défaut du système et de l'heure actuelle et l'attribuera à l'heure.
Par conséquent, à l'intérieur de toutes les instances du calendrier dont la valeur d'attribut de temps n'a pas été modifiée manuellement, la valeur de temps est la valeur temporelle du fuseau horaire par défaut à ce moment-là. En d'autres termes, le résultat de sortie de GetTime ignore les informations de fuseau horaire correspondant à l'instance actuelle. Il s'agit également d'un défaut dans la conception du calendrier, car cela entraînera la valeur de sortie Gettime des deux instances de calendrier uniquement de la durée du système lorsque l'instance est initialisée.
Le calendrier définit également de nombreuses constantes statiques et quelques tableaux d'attribut:
public final static int era = 0; public final static int any = 1; public final static int mois = 2; public final static int semaine week_of_year = 3; public final static int semaine_of_month = 4; public final static int date = 5; .... protégés intres intres []; protégée booléenne protégée []; ...
Toutes les informations pertinentes sur les dates sont stockées dans le tableau d'attribut, et les valeurs de ces constantes statiques représentent souvent une valeur d'index. Grâce à la méthode GET, nous passons dans un index d'attribut et renvoyons la valeur de l'attribut. Par exemple:
Calendar MyCalendar = Calendar.getInstance (); int year = myCalendar.get (calendar.year);
La méthode GET ici consiste en fait à prendre directement les champs [1] comme valeur de retour. Le tableau d'attribut Fields est calculé et attribué par le système en fonction du fuseau horaire et de la langue lorsque l'instance de calendrier est initialisée. Notez qu'il sera calculé en fonction du fuseau horaire que vous avez spécifié, contrairement à Time, qui est toujours basé sur le fuseau horaire par défaut du système.
Je pense personnellement que la conception de Calendar a des aspects élégants et déraisonnables. Après tout, c'est un "antiquité" et sera éventuellement remplacé.
Conversion du format DateFormat
Comme nous pouvons le voir sur l'un de nos exemples précédents, il est très difficile de sortir les informations de date de sortie dans un format attendu pour le calendrier et doit être épissé manuellement. Notre DateFormat est utilisé pour gérer la conversion entre les chaînes formatées et les DateTimes.
Comme Calendar, DateFormat est également une classe abstraite. Nous devons générer son objet d'instance via des méthodes d'usine. Il existe principalement les méthodes d'usine suivantes:
// uniquement du processus Conversion publique final static dateFormat getTimeInstance () // uniquement la conversion de la date de processus public final dateFormat GetDateInstance () // Vous pouvez gérer à la fois l'heure et la date de la date finale finale statique GetDateTimeInstance ()
Bien sûr, ils ont chacun leurs propres méthodes de surcharge, et nous verrons les détails plus tard.
Il existe deux types de méthodes pour DateFormat, Format et Parse.
Format de chaîne finale publique (date de date) Parse Parse (Source de chaîne)
La méthode de format est utilisée pour formater un objet date en tant que chaîne, et la méthode Parse est utilisée pour remplacer une chaîne formatée par un objet de date. Par exemple:
public static void main (String [] args) {calendar calendar = calendar.getInstance (); DateFormat DateFormat = DateFormat.getDateTimeInstance (); System.out.println (dateformat.format (calendar.getTime ()));}Résultat de sortie:
2018-4-21 16:58:09
De toute évidence, une instance DateFormat construite en usine ne peut pas personnaliser le contenu de mise en forme de sortie, c'est-à-dire que le format de chaîne de sortie est fixe et ne peut pas répondre aux besoins spéciaux dans certains cas. Généralement, nous utiliserons directement l'une de ses classes d'implémentation, SimpledateFormat.
SimpledateFormat vous permet de passer un paramètre de modèle lors de la construction d'une instance pour personnaliser le format de sortie des caractères de date. Par exemple:
public static void main (String [] args) {dateFormat dateFormat = new SimpledateFormat ("Yyyyy Year Mm Month Dd Day"); System.out.println (dateformat.format (new Date ()));}Résultat de sortie:
21 avril 2018
dans,
Bien sûr, il est également très pratique de convertir les dates de cordes. Les modes personnalisés sont autorisés, mais vous devez respecter les modèles que vous avez mis par vous-même, sinon le programme ne pourra pas analyser avec succès. Par exemple:
public static void main (String [] args) {String str = "Samedi 21 avril 2018"; DateFormat sdateFormat = new SimpledateFormat ("Yyyy Year M mois dd jour hh point mm point E"); sdateFormat.Parse (Str); System.out.println (sdateFormat.getCalendar (). GetTime ());}Résultat de sortie:
Sat 21 avril 17:17:00 CST 2018
De toute évidence, le programme analyse correctement notre chaîne et le convertit en un objet calendrier stocké à l'intérieur de DateFormat.
En général, Date, Calendar et DateFormat ont été en mesure de gérer les problèmes généraux et de date, mais inévitablement, ils sont toujours lourds et difficiles à utiliser.
En raison des limitations de l'espace, nous comparerons la nouvelle API de date et d'heure de Java 8 dans le prochain article, et vous constaterez qu'il a une conception plus élégante et un fonctionnement simple.