Java Date Time 教程-java.util.Calendar和GregorianCalendar

目录

  • 实例化GregorianCalendar
  • 获取年、月、日等
  • 增加和减少年、月、日等
  • 陷阱和误区
  • 月份的陷阱
  • 星期几的误区
  • JavaDoc中的更多细节

Javajava.util.Calendar用于日期和时间的运算。无论任何时候,只要你有一些轻微操作(除了仅仅表示日期和时间)需要执行,那么就使用这个类。(原文:Whenever you have something slightly more advanced than just representing a date and time, this is the class to use。)
java.util.Calendar类是抽象的,意味着你不能对其进行实例化。这么设计的原因是这个世界有着多个日历存在。举个例子,阿拉伯日历使用了一个和大部分西方国家所使用的公历不同的年份作为它的第一年。
译者注
关于现行公历,转载维基的一段内容如下(地址在这):
现行公历(拉丁语:Calendarium Gregorianum,又称格里历,又译国瑞历、额我略历、格列高利历、格里高利历),是由意大利医生兼哲学家阿洛伊修斯·里利乌斯改革儒略历制定的历法,由教皇格列高利十三世在1582年颁行。公历是阳历的一种,于1912年开始在中国正式采用,取代传统使用的中国历法农历,而中国传统历法是一种阴阳历,因而公历在中文中又称阳历、西历、新历。格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年。)

实例化GregorianCalendar

Java中只携带了格里历的实现,那就是java.util.GregorianCalendar类,下面是一个你如何实例化GregorianCalendar的例子:

Calendar calendar = new GregorianCalendar();

一个新的GregorianCalendar有着被设置为当前时间点的日期和时间,表示这是由它所创建的。

获取年、月、日等

Calendar类有着一些成对的方法可以让你获取到年、月、日、小时、分钟、秒、毫秒和给定日期的时区。下面是一些如何获取的例子:

Calendar calendar = new GregorianCalendar();

int year       = calendar.get(Calendar.YEAR);
int month      = calendar.get(Calendar.MONTH);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1
int dayOfWeek  = calendar.get(Calendar.DAY_OF_WEEK);
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);

int hour       = calendar.get(Calendar.HOUR);        // 12 hour clock
int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY); // 24 hour clock
int minute     = calendar.get(Calendar.MINUTE);
int second     = calendar.get(Calendar.SECOND);
int millisecond= calendar.get(Calendar.MILLISECOND);

你还可以访问更多的字段,比如不常用的DAY_OF_WEEK_IN_MONTHAM_PM。你可以查阅官方的JavaDoc了解这些字段的更多信息。
Calendar类有着对应的set方法,因此你也可以对这些字段进行设置。下面是它长啥样的例子:

Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 24); // christmas eve

添加和减少年、月、日等

你也可以在这些字段上添加值并使得Calendar实例准确地自行更新。看看下面的例子:

Calendar calendar = new GregorianCalendar();

//set date to last day of 2009
calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 31); // new years eve

//add one day
calendar.add(Calendar.DAY_OF_MONTH, 1);

//date is now jan. 1st 2010
int year       = calendar.get(Calendar.YEAR);  // now 2010
int month      = calendar.get(Calendar.MONTH); // now 0 (Jan = 0)
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // now 1

当进行一些日期运算的时候,add方法是非常便利的。比如在一个给定的日期上添加或者减少年数、月数、天数、小时数等。
通过调用带有负值的add方法在这些字段上减少值,比如:

calendar.add(Calendar.DAY_OF_MONTH, -1);

陷阱和误区

Calendar类中有一些小陷阱,你应该知道这些陷阱从而避免不必要的伤脑经。我将会在接下来的章节讨论他们。

月份陷阱

Calendar类的MONTH字段并不像我们在其他地方写下日期般从1到12。取而代之的是月份从0走到11,0是1月,11是12月份。如果你不知道这个的话,它将会引发一点错误和随其而来的调试。

星期几误区

如你希望的那样,星期是从1走到7,但是每周的第一天是周六而不是周一。这意味着1 = sunday, 2 = monday, …, 7 = Saturday。这也时不时地让我感到有点烦恼。

JavaDoc中的更多细节

如果你需要做一些日期和时间的复杂运算,那么查阅官方Javadocjava.util.Calendar文档是个不错的主意。类文档包含了更多关于该类的特性。举个例子假如你设置日期为2009年1月34日,那么真实的日期是什么呢?

时间: 2024-08-26 08:28:51

Java Date Time 教程-java.util.Calendar和GregorianCalendar的相关文章

Java Date Time 教程-java.util.Date

原文链接 作者:Jakob Jenkov  译者:魏嘉鹏 Java的java.util.Date类是Java最初的时间类之一.今天该类的大部分方法已不推荐使用,取而代之的是java.util.Calendar类.不过你仍然可以使用java.util.Date类去表示某个时间.下面是一个如何实例化java.util.Date的例子: java.util.Date date = new java.util.Date(); Date实例包含了当前时间作为它的日期和时间.你可以通过getTime()方法

Java Date Time 教程-java.sql.Date

Java的java.sql.Date类在JDBC API中被使用.如果你需要在java.sql.PreparedStatement上设置日期或者从java.sql.ResultSet获取日期,你将会和java.sql.Date打交道. 实际上,java.sql.Date继承于java.util.Date,所以你可以用java.util.Date做的任何事同样适用于java.sql.Date.查阅 java.util.Date 了解更多的信息.下面是一个如何实例化java.sql.Date的例子:

Java Date Time 教程-java.sql.Timestamp

Java的java.sql.Timestamp类在JDBC API中被使用.如果你需要在java.sql.PreparedStatement上设置日期+时间或者从java.sql.ResultSet获取日期+时间,你将会和java.sql.Timestamp打交道. 实际上,java.sql.Timestamp继承于java.util.Date,所以你可以用java.util.Date做的任何事同样适用于java.sql.Timestamp.查阅 java.util.Date 了解更多的信息.j

Java Date Time 教程

原文链接 作者:Jakob Jenkov  译者:魏嘉鹏 目录 Java 8 Date Time API Java 7 Date Time API 当你初次尝试弄明白怎么去使用Java的date time 的API的时候,那是相当令人困惑的.Therefore I have put together this little trail on Java's date and time classes.希望这会让你对Java'的date类和time类有个总体的认识.我也希望这能消除一些Sun所制造的

Java日期时间 java.util.Calendar和GregorianCalendar分析

Java的java.util.Calendar用于日期和时间的运算.无论任何时候,只要你有一些轻微操作(除了仅仅表示日期和时间)需要执行,那么就使用这个类.(原文:Whenever you have something slightly more advanced than just representing a date and time, this is the class to use.) java.util.Calendar类是抽象的,意味着你不能对其进行实例化.这么设计的原因是这个世界

Java Date Time 教程-System.currentTimeMillis()

原文链接 作者:Jakob Jenkov  译者:魏嘉鹏 静态方法System.currentTimeMillis() 返回从1970年1月1日到现在的总毫秒数.返回类型为long.下面是一个例子: long timeNow = System.currentTimeMillis(); 实际上要做的就只有这么多了.返回long类型的值可以用于初始化java.util.Date,java.sql.Date.java.sql.Timestamp和java.util.GregorianCalendar对

Java Date Time 教程-时间测量

在Java中,用System.currentTimeMillis()来测量时间最方便. 你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差.下面是一个例子: 1 long startTime = System.currentTimeMillis(); 2 callOperationToTime(); 3 long endTime   = System.currentTimeMillis(); 4 long totalTime = endTime - startTim

使用java.util.Calendar返回间隔天数

calendar 使用SimpleDateFormat,规定好格式,parser出错即为非法/** * Calculates the number of days between two calendar days in a manner * which is independent of the Calendar type used. * * @param d1    The first date. * @param d2    The second date. * * @return    

java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结

java.util.Date.java.sql.Date.java.sql.Time.java.sql.Timestamp区别和总结   java.lang.Object  ....|__java.util.Date  ..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time [父类]java.util.Date日期格式为:年月日时分秒  [子类]java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据]  [子类