Maison  >  Article  >  Java  >  Présentation du calendrier

Présentation du calendrier

零下一度
零下一度original
2017-07-23 10:22:391384parcourir

1. Aperçu du calendrier

Java recommande officiellement d'utiliser le calendrier pour remplacer l'utilisation de la date. Le calendrier et la date peuvent être librement convertis. Le lien de conversion est time. peut obtenir un objet de type Date. La couche inférieure de cet objet est créée à l'aide du deuxième constructeur de Date avec un paramètre de type Long. Ce paramètre de type Long est la valeur enregistrée dans le champ d'heure du calendrier. La valeur de ce champ d'heure est The. l'affectation est définie dans une classe d'implémentation spécifique, comme l'implémentation de calculateTime() dans GregorianCalendar. Le but de cette méthode est de convertir la valeur du champ en valeur temporelle. Cela implique deux modes dans Calendar, qui seront introduits plus tard ; via Calendar La méthode setTime(Date date) peut convertir un objet Date en objet Calendar. Cette méthode prend un objet Date comme paramètre. La méthode setTimeInMillis(long millis) appelée par la couche inférieure prend la valeur de date.getTime(). en tant que paramètre. La couche inférieure attribuera cette valeur de paramètre Long au champ de temps et la valeur du champ sera recalculée.

Conversion du calendrier et de la date

 1     public static void main(String[] args) { 2         //Calendar--->Date 3         Calendar c = Calendar.getInstance(); 4         Date d = c.getTime(); 5         //Date--->Calendar 6         Date d1 = new Date(); 7         Calendar c1 = Calendar.getInstance(); 8         c1.setTime(d1); 9         10         System.out.println(d);11         System.out.println(c1.get(Calendar.YEAR)+"年"+(c1.get(Calendar.MONTH)+1)+"月"+c1.get(Calendar.DATE)+"日");12     }

Résultat :

Sat Jul 08 10:39:14 CST 20172017年7月8日

2. field

Il y a deux champs dans le calendrier qui décrivent le contenu temporel. L'un est le temps, qui est utilisé pour enregistrer le nombre de millisecondes à 00:00:00 le 1er janvier 1970 à l'heure représentée par le calendrier. L'autre est le champ, qui est un tableau. Il ne représente pas un contenu, mais les champs constants les plus statiques définis dans Calendar.

 C'est généralement synchrone, c'est-à-dire qu'il exprime le même instant, mais il peut aussi être désynchronisé :

 a Initialement, le champ n'est pas défini, et l'heure. n'est pas valide.

b. Si l'heure est définie, tous les champs seront automatiquement définis sur le point horaire synchronisé

c. Si un champ est défini individuellement, l'heure expirera automatiquement

Pour être plus précis, lorsque nous obtenons un nouvel objet Calendar via la méthode Calendar.getInstance(), le point temporel qu'il représente est défini dans le temps, et la valeur de cette heure est obtenue via System.currentTimeMillis() Définir le calendrier via time. isTimeSet est vrai, ce qui signifie que la valeur de temps est la plus récente (vrai), et areFieldsSet est faux, ce qui signifie que les valeurs des champs de champ sont toutes anciennes (faux), car lorsque nous réinitialisons la valeur de temps, Le point temporel représenté par le calendrier a changé (c'est la première fois, ce qui équivaut à repartir de zéro, ce qui est également un changement. Plus tard, lorsque nous réinitialisons une nouvelle valeur pour l'heure du calendrier, le point temporel du calendrier changera à nouveau. Il pointez vers le point temporel représenté par la dernière valeur temporelle), et à ce moment, le champ représente toujours le contenu du point temporel d'origine, puis la méthode calculateFields() sera appelée pour recalculer toutes les valeurs du champ afin de garantir que les valeurs ​dans le champ sont cohérents avec Time est synchronisé, et areFieldsSet et areAllFieldsSet sont définis sur true en même temps, indiquant que les valeurs de temps représentées par tous les champs sont également les dernières (vrai). En fait, chaque fois que nous modifions la valeur temporelle, cela déclenchera automatiquement un recalcul pour garantir que les points temporels décrits par les deux domaines sont cohérents (c'est-à-dire synchronisés), ce qui est décrit en b ci-dessus.

Mais si nous modifions individuellement une ligne et un champ dans le champ via set(int field, int value), une vérification sera déclenchée en premier. Lorsque areFieldsSet est vrai et areAllFieldsSet est faux, cela signifie que seulement une partie. du champ est la dernière situation, c'est-à-dire que certains champs sont anciens. Dans ce cas, un recalcul des champs sera déclenché ; après cela, isTimeSet sera défini sur false, areFieldsSet sera défini sur false et isSet[. field] sera défini sur true (le champ actuel défini sur true), dans ce cas, lorsque nous utiliserons getTime() pour obtenir le point temporel représenté par la valeur temporelle, puisque isTimeSet est faux, un recalcul du temps sera déclenché. Ce calcul est basé sur la valeur du champ. Après cela, définissez isTimeSet sur true De même, lorsque nous obtenons une valeur de champ via get(int field), nous vérifierons d'abord si isTimeSet est vrai. Si elle est fausse, elle le sera également. déclenchez le recalcul du temps, puis vérifiez que areFieldsSet est faux, puis déclenchez le recalcul des champs restants.

Le recalcul du temps est basé sur des champs Pour être précis, il est basé sur une partie des champs. Certains champs sont également recalculés sur la base de champs. On peut donc dire que certains champs sont fixes et. sont égaux à Time est étroitement lié,

Tout ce qui précède est les règles d'implémentation internes de Calendar. En externe, nous n'avons besoin que d'appels simples, qui sont tous cachés en interne, garantissant que nous les obtenons via des méthodes externes. La valeur correcte est obtenue directement.

 1     public static void main(String[] args) throws ParseException { 2         System.out.println("-------初始情况-------"); 3         Calendar c = Calendar.getInstance(); 4         System.out.println(c.getTime()); 5         System.out.println(c.get(Calendar.DATE)); 6         System.out.println(c.get(Calendar.HOUR)); 7         System.out.println("-------重设置time-------"); 8         c.setTime(new SimpleDateFormat("yyyyMMdd").parse("20170501")); 9         System.out.println(c.getTime());10         System.out.println(c.get(Calendar.DATE));11         System.out.println(c.get(Calendar.HOUR));12         System.out.println("-------重设置field-------");13         c.set(Calendar.MONTH, 4);14         System.out.println(c.getTime());15         System.out.println(c.get(Calendar.DATE));16         System.out.println(c.get(Calendar.HOUR));17         System.out.println("总结:time与field所代表时间点同步,所有的不同步全部在内部处理完成");18     }

Résultat :

-------初始情况-------Sat Jul 08 13:08:34 CST 2017
8
1
-------重设置time-------Mon May 01 00:00:00 CST 2017
1
0
-------重设置field-------Mon May 01 00:00:00 CST 2017
1
0总结:time与field所代表时间点同步,所有的不同步全部在内部处理完成

Deux modes d'analyse dans Calendrier

Indulgent : Le mode peut régulariser automatiquement les valeurs irrégulières attribuées par les utilisateurs au calendrier. Par exemple, le 32 janvier sera analysé comme le 1er février

Non clément : une entrée irrégulière ne sera pas automatiquement analysée dans ce mode, mais une fois qu'une entrée irrégulière est trouvée. , une exception sera signalée

C'est également ce qu'on appelle la tolérance aux pannes du calendrier. L'activation et la désactivation de indulgente sont définies à l'aide de la méthode setLenient(boolean lenient) . , false signifie désactiver cette fonction.

 1     public static void main(String[] args) { 2         Calendar c = Calendar.getInstance(); 3         c.set(Calendar.MONTH, 8); 4         c.set(Calendar.DAY_OF_MONTH, 33); 5         System.out.println(c.getTime()+"\n"); 6         c.setLenient(false); 7         c.set(Calendar.MONTH, 8); 8         c.set(Calendar.DAY_OF_MONTH, 33); 9         System.out.println(c.getTime());10     }

结果:

Tue Oct 03 13:18:48 CST 2017Exception in thread "main" java.lang.IllegalArgumentException: DAY_OF_MONTH
    at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2583)
    at java.util.Calendar.updateTime(Calendar.java:2606)
    at java.util.Calendar.getTimeInMillis(Calendar.java:1118)
    at java.util.Calendar.getTime(Calendar.java:1091)
    at JdkTest.main(JdkTest.java:87)

  从上面的例子中可以看出,默认情况下,我们为Calendar的月份赋值为8即九月份,日期赋值为33即下一月3号,输出为10月3日,容错性将这种不符合规则的输入规则化处理了,而关闭容错性之后,同样的赋值只会报异常java.lang.IllegalArgumentException(非法参数异常)。

4、Calendar的使用

 1     public static void main(String[] args) throws ParseException { 2         //通过SimpleDateFormat解析日期字符串 3         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss.SSS"); 4         Date date = sdf.parse("20170502 13:33:23.433"); 5         //将Date格式日期转换成Calendar 6         Calendar c = Calendar.getInstance(); 7         c.setTime(date); 8         //获取时间值 9         System.out.println(c.getTime());10         System.out.println("年份为"+c.get(Calendar.YEAR));11         System.out.println("月份为"+c.get(Calendar.MONTH));12         System.out.println("日期为"+c.get(Calendar.DATE));13         System.out.println("日期为"+c.get(Calendar.DAY_OF_MONTH));14         System.out.println("日期为"+c.get(Calendar.DAY_OF_WEEK));15         System.out.println("日期为"+c.get(Calendar.DAY_OF_WEEK_IN_MONTH));16         System.out.println("日期为"+c.get(Calendar.DAY_OF_YEAR));17         System.out.println("时为"+c.get(Calendar.HOUR));18         System.out.println("时为"+c.get(Calendar.HOUR_OF_DAY));19         System.out.println("分为"+c.get(Calendar.MINUTE));20         System.out.println("秒为"+c.get(Calendar.SECOND));21         System.out.println("毫秒为"+c.get(Calendar.MILLISECOND));22         System.out.println("星期为"+c.get(Calendar.WEEK_OF_MONTH));23         System.out.println("星期为"+c.get(Calendar.WEEK_OF_YEAR));24         System.out.println("历型为"+c.get(Calendar.ERA));25         System.out.println("zone为"+c.get(Calendar.ZONE_OFFSET));26         //设置27         c.set(Calendar.MONTH, Calendar.APRIL);28         System.out.println("修改后月份为"+c.get(Calendar.MONTH));29         c.set(1999, 0, 23);30         System.out.println(c.getTime());31         c.set(2000, 1, 12, 13, 33, 14);32         System.out.println(c.getTime());33         c.set(2001, 2, 13, 14, 13);34         System.out.println(c.getTime());35         //运算36         System.out.println("-----运算-----");37         c.add(Calendar.YEAR, 12);38         System.out.println(c.getTime());39         c.add(Calendar.MONTH, -1);40         System.out.println(c.getTime());41         c.roll(Calendar.DATE, true);42         System.out.println(c.getTime());43         c.add(Calendar.DATE, 1);44         System.out.println(c.getTime());45         //roll与add运算对比46         c.set(2000, 1, 29);47         System.out.println(c.getTime());48         c.roll(Calendar.DATE, 1);49         System.out.println(c.getTime());50         c.set(2000, 1, 29);51         c.add(Calendar.DATE, 1);52         System.out.println(c.getTime());53     }

结果:

Tue May 02 13:33:23 CST 2017年份为2017
月份为4
日期为2
日期为2
日期为3
日期为1
日期为122
时为1
时为13
分为33
秒为23
毫秒为433
星期为1
星期为18
历型为1
zone为28800000
修改后月份为3
Sat Jan 23 13:33:23 CST 1999Sat Feb 12 13:33:14 CST 2000Tue Mar 13 14:13:14 CST 2001
-----运算-----Wed Mar 13 14:13:14 CST 2013Wed Feb 13 14:13:14 CST 2013Thu Feb 14 14:13:14 CST 2013Fri Feb 15 14:13:14 CST 2013Tue Feb 29 14:13:14 CST 2000Tue Feb 01 14:13:14 CST 2000Wed Mar 01 14:13:14 CST 2000

  对比上面最后的两行输出,可以看出add与roll的运算规则其实是不同的,roll的运算不会影响大规则(这里的大规则指的是月份的改变)的改变,而add会影响。 

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:
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