>  기사  >  Java  >  달력 개요

달력 개요

零下一度
零下一度원래의
2017-07-23 10:22:391378검색

1. Calendar 개요

Java에서는 Date 대신 Calendar를 사용할 것을 공식적으로 권장합니다. Calendar와 Date는 자유롭게 변환할 수 있으며, Date 유형의 객체를 얻으려면 Calendar의 getTime() 메소드를 사용하세요. 이 객체의 맨 아래 레이어는 Long 유형 매개변수와 함께 Date의 두 번째 생성자를 사용하여 생성됩니다. 이 Long 유형 매개변수는 Calendar의 시간 필드에 저장된 값입니다. 예를 들어, GregorianCalendar의 ComputeTime() 구현은 필드 값을 시간 값으로 변환하는 것입니다. 이는 나중에 소개될 Calendar의 두 가지 모드와 관련됩니다. Calendar, 당신은 할 수 있습니다. Date 객체는 Calendar 객체로 변환됩니다. 이 메소드는 Date 객체를 매개변수로 사용합니다. 맨 아래 레이어에서 호출되는 setTimeInMillis(long millis) 메소드는 date.getTime() 값을 매개변수로 사용합니다. 그러면 맨 아래 레이어가 Long 매개변수 값을 시간 필드에 할당하고 이때 필드 값이 다시 계산됩니다.

 달력 및 날짜 변환

 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     }

결과:

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

2. 달력의 시간 및 필드

달력에는 시간 내용을 설명하는 두 개의 필드가 있는데, 하나는 달력을 저장하는 데 사용됩니다. 객체가 나타내는 시점은 1970년 1월 1일 00:00:00의 밀리초 수입니다. 다른 하나는 배열인 필드이며, 내용을 나타내지는 않지만 Calendar 필드 내에 정의된 가장 정적인 상수입니다. .

 이것은 일반적으로 동기적입니다. 즉, 동일한 시점을 표현하지만 동기화되지 않을 수도 있습니다.

 a. 처음에는 필드가 설정되지 않으며 시간이 유효하지 않습니다

 b. 설정하면 모든 필드가 자동으로 동기화된 시점으로 설정됩니다

 c. 특정 필드를 개별적으로 설정하면 시간이 자동으로 만료됩니다

 보다 정확하게는 Calendar.getInstance() 메서드를 통해 새로운 시간을 얻을 때입니다. 객체가 나타내는 시점은 시간을 통해 설정되며, 이 시간의 값은 System.currentTimeMillis()를 통해 얻어지며, Calendar는 시간을 통해 정의되며, isTimeSet은 true이므로 시간 값이 최신(true)임을 나타냅니다. areFieldsSet은 false입니다. 이는 필드 필드의 값이 모두 이전(false)이라는 의미입니다. 시간 값을 재설정할 때 Calendar가 나타내는 시점이 변경되었기 때문입니다(이번이 처음이며 이는 시작과 동일함). 예, 이는 변경으로 간주됩니다. 나중에 캘린더의 시간에 대한 새 값을 재설정하면 캘린더의 시점이 다시 변경되고 최신 시간 값으로 표시되는 시점을 가리킵니다. 시간이 지나도 필드에 새 값이 있습니다. 이는 원래 시점 내용을 나타내며, 필드의 값이 시간과 동기화되도록 모든 필드 값을 다시 계산하기 위해 ComputeFields() 메서드가 호출됩니다. , 동시에 areFieldsSet 및 areAllFieldsSet은 true로 설정되어 모든 필드가 나타내는 시간도 최신 상태(true)임을 나타냅니다. 실제로 시간 값을 변경할 때마다 자동으로 재계산을 실행하여 두 도메인에서 설명하는 시점이 일관성(즉, 동기화)인지 확인합니다. 이는 위의 b에서 설명한 내용입니다.

 하지만 set(int field, int value)을 통해 필드의 행과 필드를 개별적으로 변경하면 먼저 확인이 시작됩니다. areFieldsSet이 true이고 areAllFieldsSet이 false이면 필드의 일부만 변경된다는 의미입니다. 즉, 일부 필드는 오래되었습니다. 이 경우 필드 재계산이 트리거되고 isTimeSet은 false로 설정되고 isSet[field]는 설정됩니다. true로 설정(현재 필드는 true로 설정됨). 이 경우 getTime()을 사용하여 시간 값으로 표시되는 시점을 얻으면 isTimeSet이 false이므로 시간 재계산이 트리거됩니다. 필드 값을 기준으로 isTimeSet을 true로 설정합니다. 마찬가지로 get(int 필드)를 통해 필드 값을 얻을 때 isTimeSet이 true인지 먼저 확인합니다. false이면 재계산도 트리거됩니다. 그런 다음 areFieldsSet이 false인지 확인하세요. 그러면 나머지 필드 계산이 다시 시작됩니다.

  시간의 재계산은 필드를 기준으로, 정확히 말하면 일부 필드를 기준으로 하고, 일부 필드도 필드를 기준으로 재계산되므로 일부 필드는 고정되어 있고 시간과 밀접한 관련이 있다고 할 수 있습니다.

위의 모든 사항은 Calendar의 내부 구현 규칙입니다. 외부적으로는 간단한 호출만 필요하며, 외부 방법을 통해 얻은 값이 직접 올바른 값인지 확인합니다.

 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     }

결과:

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

3. 캘린더의 두 가지 구문 분석 모드

관대함: 이 모드에서는 사용자가 캘린더에 할당한 불규칙한 값이 자동으로 정규화될 수 있습니다. 예를 들어 1월 32일은 다음과 같이 구문 분석됩니다. 2월 1일

비관대함: 이 모드에서는 불규칙한 입력이 자동으로 구문 분석되지 않지만, 불규칙한 입력이 발견되면 예외가 보고됩니다.

이를 Calendar의 내결함성이라고도 하며, lenient 이를 설정하려면 setLenient(boolean lenient) 메소드를 사용하십시오. true는 내결함성을 켜는 것을 의미하고(기본값) false는 이 기능을 끄는 것을 의미합니다.

rreee

结果:

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

위 내용은 달력 개요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.