日历代码解析_第1页
日历代码解析_第2页
日历代码解析_第3页
日历代码解析_第4页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA Calendar 详解 收藏(在文章的最后,将会介绍Date 类,若是有爱好,能够直接翻到最后去阅读)究竟什么是一个 Calendar 呢?中文的翻译确实是日历,那咱们立刻能够想到咱们生活中有阳( 公)历、阴 (农 )历之分。它们的区别在哪呢?比如有:月份的概念- 阳 ( 公)历 一年12 个月,每一个月的天数各不同;阴(农) 历,每一个月固定28 天每周的第一天- 阳 (公 )历礼拜日是第一天;阴(农 )历,礼拜一是第一天事实上, 在历史上有着许多种纪元的方式。它们的不同实在太大了,比如说一个人的生日是" 八月八日 " 那么一种可能是阳 (公 )历的八月八日,但

2、也能够是阴 (农 )历的日期。因此为了计时的统一,必需指定一个日历的选择。那此刻最为普及和通用的日历确实是"GregorianCalendar" 。也确实是咱们在讲述年份时经常使用" 公元几几年 " 。 Calendar 抽象类概念了足够的方式, 让咱们能够表述日历的规那么。Java 本身提供了对"Gregorian Calendar"规那么的实现。咱们从() 中所取得的实例确实是一个"GreogrianCalendar"对象 (与您通过newGregorianCalendar()取得的结果一致)。下面的代码能够证

3、明这一点:import .*;import .*;public class WhatIsCalendarpublic static void main(String args) Calendar calendar = ();if (calendar instanceof GregorianCalendar)"It is an instance of GregorianCalendar"t;Calendar 在 Java 中是一个抽象类(Abstract Class) ,GregorianCalendar是它的一个具体实现。咱们也能够自己的Calendar 实现类,然后将它作

4、为Calendar 对象返回 (面向对象的特性)。在 IBMalphaWorks 上, IBM的开发人员实现了多种日历。一样在Internet 上,也有对中国农历的实现。 本文对如何扩展 Calendar 不作讨论, 大伙儿能够通过观察上述 Calendar 的源码来学习。Calendar 与 Date 的转换超级简单:Calendar calendar = ();Calendar 的 set() 方式set(int field, int value) -是用来设置 "年 /月 /日 /小时 /分钟 /秒 /微秒 " 等值field的概念在Calendar 中set(int

5、 year, int month, int day, int hour, int minute, int second)但没有set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前 面 set(int,int,int,int,int,int) 方式可不能自动将 MilliSecond 清为 0。另外,月份的起始值为而不是,因此要设置八月时,咱们用而不是8。, 7);咱们通常需要在程序逻辑中将它清为0,不然可能会显现下面的情形:import .*;import .*;public

6、 class WhatIsCalendarWritepublic static void main(String args) throws ExceptionObjectOutputStream out =new ObjectOutputStream(new FileOutputStream(""t);Calendar cal1 = ();(2000, 7, 1, 0, 0, 0);(cal1);Calendar cal2 = ();(2000, 7, 1, 0, 0, 0);, 0);(cal2);();咱们将Calendar 保留到文件中import .*;import

7、 .*;public class WhatIsCalendarReadpublic static void main(String args) throws ExceptionObjectInputStream in =new ObjectInputStream(new FileInputStream(""t);Calendar cal2 = (Calendar)();Calendar cal1 = ();(2000, 7, 1, 0, 0, 0);if (cal2)"Equals"t;else"NotEqual"t;"Ol

8、d calendar "+().getTime();"New calendar "+().getTime();, 0);cal2 = (Calendar)();if (cal2)"Equals"t;else"NotEqual"t;"Processed Old calendar "+().getTime();"Processed New calendar "+().getTime();然后再另外一个程序中取回来(模拟对数据库的存储),可是执行的结果是:NotEqualOld calend

9、ar 0422 <-最后三位的MilliSecond 与当前时刻有关New calendar 0059 <-/EqualsProcessed Old calendar 0000Processed New calendar 0000另外咱们要注意的一点是,Calendar 为了性能缘故对set() 方式采取延缓计算的方式。在JavaDoc 中有下面的例子来讲明那个问题:Calendar cal1 = ();(2000, 7, 31, 0, 0 , 0); Calendar对象的容错性,Lenient 设置咱们明白特定的月份有不同的日期,当一个用户给犯错误的日期时,Calendar 如

10、何处置的呢?import .*;import .*;public class WhatIsCalendarpublic static void main(String args) throws ExceptionCalendar cal1 = ();(2000, 1, 32, 0, 0, 0);1, 32, 0, 0, 0);它的执行结果是:Tue Feb 01 00:00:00 PST 2000Exception in thread "main":12)当咱们设置该Calendar 为 Lenient false时,它会依据特定的月份检查犯错误的赋值。3. 不稳固的Cal

11、endar咱们明白Calendar 是能够被serialize 的,可是咱们要注意下面的问题import .*;import .*;public class UnstableCalendar implements Serializablepublic static void main(String args) throws ExceptionCalendar cal1 = ();(2000, 7, 1, 0, 0 , 0);, 0);ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream(""t

12、);(cal1);();ObjectInputStream in =new ObjectInputStream(new FileInputStream(""t);Calendar cal2 = (Calendar)();, 0);运行的结果竟然是: Thu Jan 01 00:00:00 PST 1970它被恢复到EPOC 的起始点,咱们称该Calendar 是处于不稳固状态。那个问题的全然缘故是Java 在serialize GregorianCalendar 时没有保留所有的信息,因此当它被恢复到内存中,又缺少足够的信息时,Calendar 会被恢复到EPOCH 的起始

13、值。 Calendar 对象由两部份组成:字段和相关于EPOC 的微秒时刻差。字段信息是由微秒时刻差计算出的,而set()方式可不能强制Calendar 从头计算字段。如此字段值就不对了。下面的代码能够解决那个问题:import .*;import .*;public class StableCalendar implements Serializablepublic static void main(String args) throws ExceptionCalendar cal1 = ();(2000, 7, 1, 0, 0 , 0);, 0);ObjectOutputStream ou

14、t =new ObjectOutputStream(new FileOutputStream(""t);(cal1);();ObjectInputStream in =new ObjectInputStream(new FileInputStream(""t);Calendar cal2 = (Calendar)(); add() 与 roll()的区别add() 的功能超级壮大,add 能够对Calendar 的字段进行计算。若是需要减去值,那么利用负数值就能够够了,如add(field, -value) 。add() 有两条规那么:当被修改的字段超出

15、它能够的范围时,那么比它大的字段会自动修正。如:Calendar cal1 = ();(2000, 7, 31, 0, 0 , 0);那个时刻通常被称为Java 虚拟机 (JVM) 主机环境的系统时刻.importpublic class DateExample1 public static void main(String args) 在那个例子中 ,值得注意的是咱们利用了Date 构造函数创建一个日期对象, 那个构造函数没有同意任何参数. 而那个构造函数在内部Date();那么输出形式为:Tue Nov 08 14:28:07 CST 2005那么 , 此刻咱们已经明白了如何获取从1970

16、 年 1 月 1 日开始经历的毫秒数了. 咱们如何才能以一种用户明白的格式来显示那个日期呢? 在那个地址类.SimpleDateFormat和它的抽象基类就派得上用处了.二、日期数据的定制格式假设咱们希望定制日期数据的格式 , 例如礼拜六 -9 月-29 日 -2001 年 . 下面的例子展示了如何完成那个工作 :importpublic class DateExample2 public static void main(String args) SimpleDateFormat bartDateFormat =new SimpleDateFormat("EEEE-MMMM-dd-

17、yyyy");Date date = new Date();只要通过向 SimpleDateFormat 的构造函数传递格式字符串 "EEE-MMMM-dd-yyyy", 咱们就能够够指明自己想要的格式 . 你应该能够看见 , 格式字符串中的 ASCII 字符告知格式化函数下面显示日期数据的哪个部份. EEEE 是礼拜 , MMMM是月 , dd 是日, yyyy 是年 . 字符的个数决定了日期是如何格式化的.传递 "EE-MM-dd-yy"会显示Sat-09-29-01. 请观察 Sun 公司的 Web 站点获取日期格式化选项的完整的指示.三

18、、将文本数据解析成日期对象r假设咱们有一个文本字符串包括了一个格式化了的日期对象, 而咱们希望解析那个字符串并从文今日期数据创建一个日期对象. 咱们将再次以格式化字符串"MM-dd-yyyy" 挪用 SimpleDateFormat 类 , 可是这一次 , 咱们利用格式化解析而不是生成一个文今日期数据 . 咱们的例子 , 显示在下面 , 将解析文本字符串 "9-29-2001" 并创建一个值为 0000 的日期对象 .例子程序 :importpublic class DateExample3 public static void main(String args) SimpleDateFormat bartDateFormat =new SimpleDateFormat("MM-dd-yyyy");String dateStringToParse = "9-29-2001"try Date date = (dateStringToParse);(Exception ex) 五、利用标准的日期格式化进程既然咱们已经能够生成和解析定制的日期格式了 , 让咱们来看一看如何利用内建的格式化进程 . 方式 () 让咱们得以用几种不同的方式取得标准的日期格式化进程 . 在下面的例子中 , 咱

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论