Heim  >  Artikel  >  Java  >  Übersicht über den Kalender

Übersicht über den Kalender

零下一度
零下一度Original
2017-07-23 10:22:391397Durchsuche

1. Kalenderübersicht

Java empfiehlt offiziell die Verwendung von Calendar und Date kann frei konvertiert werden. Verwenden Sie die Methode getTime() Die unterste Ebene dieses Objekts wird mit dem zweiten Konstruktor von Date mit einem Long-Typ-Parameter erstellt. Dieser Long-Typ-Parameter ist der im Zeitfeld gespeicherte Wert Die Zuweisung wird in einer bestimmten Implementierungsklasse definiert, beispielsweise in der Implementierung von „computeTime()“ in GregorianCalendar. Der Zweck dieser Methode besteht darin, den Feldwert in einen Zeitwert umzuwandeln, der später vorgestellt wird über Calendar Die Methode setTime(Date date) kann ein Date-Objekt in ein Calendar-Objekt konvertieren. Die von der unteren Ebene aufgerufene Methode setTimeInMillis(long millis) übernimmt den Wert von date.getTime(). als Parameter. Die unterste Ebene weist diesen langen Parameterwert dem Zeitfeld zu und der Feldwert wird neu berechnet.

Konvertierung von Kalender und Datum

 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     }

Ergebnis:

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

2. Uhrzeit und Datum im Kalender Feld

Es gibt zwei Felder im Kalender, die den Zeitinhalt beschreiben. Das eine ist die Zeit, die verwendet wird, um die Anzahl der Millisekunden am 1. Januar 1970 um 00:00:00 Uhr zu dem durch den Kalender dargestellten Zeitpunkt zu speichern Das andere ist ein Feld, bei dem es sich nicht um einen Inhalt handelt, sondern um die statischsten Konstantenfelder, die im Kalender definiert sind.

 Dies ist im Allgemeinen synchron, das heißt, es drückt den gleichen Zeitpunkt aus, es kann jedoch auch nicht synchron sein:

 Anfangs ist das Feld nicht festgelegt und die Zeit ist ungültig.

Wenn die Zeit eingestellt ist, werden alle Felder automatisch auf den synchronisierten Zeitpunkt eingestellt

c 🎜> Genauer gesagt: Wenn wir ein neues Kalenderobjekt über die Methode Calendar.getInstance() erhalten, wird der von ihm dargestellte Zeitpunkt durch die Zeit festgelegt, und der Wert dieser Zeit wird durch System.currentTimeMillis() ermittelt. Definieren Sie den Kalender durch time.isTimeSet ist wahr, was bedeutet, dass der Zeitwert der neueste (wahr) ist, und areFieldsSet ist falsch, was bedeutet, dass die Werte der Feldfelder alle alt (falsch) sind, denn wenn wir den Zeitwert zurücksetzen, Der durch den Kalender dargestellte Zeitpunkt hat sich geändert (dies ist das erste Mal, was einem Neuanfang entspricht, was ebenfalls eine Änderung darstellt. Später, wenn wir einen neuen Wert für die Zeit des Kalenders zurücksetzen, ändert sich der Zeitpunkt des Kalenders erneut. Das wird der Fall sein Zeigen Sie auf den Zeitpunkt, der durch den neuesten Zeitwert dargestellt wird. Zu diesem Zeitpunkt stellt das Feld immer noch den ursprünglichen Zeitpunktinhalt dar. Anschließend wird die Methode „computeFields()“ aufgerufen, um alle Feldwerte neu zu berechnen und sicherzustellen, dass die Werte ​​im Feld sind konsistent mit Die Zeit ist synchronisiert, und areFieldsSet und areAllFieldsSet werden gleichzeitig auf true gesetzt, was darauf hinweist, dass die von allen Feldern dargestellten Zeitwerte ebenfalls die neuesten (true) sind. Tatsächlich wird jedes Mal, wenn wir den Zeitwert ändern, automatisch eine Neuberechnung ausgelöst, um sicherzustellen, dass die von den beiden Domänen beschriebenen Zeitpunkte konsistent (dh synchronisiert) sind, was oben in b beschrieben ist.

Wenn wir jedoch eine Zeile und ein Feld im Feld einzeln über set(int field, int value) ändern, wird zuerst eine Überprüfung ausgelöst. Wenn areFieldsSet true und areAllFieldsSet false ist, bedeutet dies nur einen Teil des Feldes ist die neueste Situation, das heißt, einige Felder sind alt. In diesem Fall wird eine Neuberechnung der Felder ausgelöst, danach wird isTimeSet auf false gesetzt, areFieldsSet wird auf false gesetzt und isSet[ field] wird auf true gesetzt (das aktuelle Feld wird auf true gesetzt). Wenn wir in diesem Fall getTime() verwenden, um den durch den Zeitwert dargestellten Zeitpunkt zu erhalten, wird eine Neuberechnung der Zeit ausgelöst, da isTimeSet false ist. Diese Berechnung basiert auf dem Wert des Felds. Wenn wir einen Feldwert über get(int field) erhalten, überprüfen wir zunächst, ob er true ist Lösen Sie die Neuberechnung der Zeit aus und überprüfen Sie dann, ob areFieldsSet falsch ist. Lösen Sie dann die Neuberechnung der verbleibenden Felder aus.

Die Neuberechnung der Zeit basiert auf einem Teil der Felder. Daher kann man sagen, dass einige Felder festgelegt sind sind gleich Zeit ist eng miteinander verbunden,

Alle oben genannten sind die internen Implementierungsregeln von Calendar. Äußerlich benötigen wir nur einfache Aufrufe, die alle intern verborgen sind, um sicherzustellen, dass wir sie über externe Methoden erhalten. Der korrekte Wert wird direkt ermittelt.

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

-------初始情况-------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所代表时间点同步,所有的不同步全部在内部处理完成
2. Zwei Parsing-Modi im Kalender

Nachsichtig: Der Modus kann Von Benutzern dem Kalender zugewiesene unregelmäßige Werte automatisch regulieren. Beispielsweise wird der 32. Januar als 1. Februar analysiert.

Nicht nachsichtig: Unregelmäßige Eingaben werden in diesem Modus nicht automatisch analysiert. Sobald jedoch unregelmäßige Eingaben gefunden werden , eine Ausnahme wird gemeldet

Dies wird auch als Fehlertoleranz des Kalenders bezeichnet. Das Ein- und Ausschalten von Lenient wird mit der Methode setLenient(boolean lenient) festgelegt, was bedeutet, dass die Fehlertoleranz aktiviert ist (Standard). , false bedeutet, dass diese Funktion deaktiviert wird.

结果:

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会影响。 

Das obige ist der detaillierte Inhalt vonÜbersicht über den Kalender. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn