1.班级转Date班级Calendar

程序员喜欢这个Date类,因为它的简单性和对 Unix 标准的支持,但如您所知,每朵玫瑰都有刺。

程序员想要一个“智能”Date类。他们以课堂的形式得到了他们想要的东西Calendar。它被认为是一种不仅可以存储日期,还可以对日期执行困难操作的方法。

该类的全名Calendar是 java.util.Calendar。如果您决定在代码中使用它,请不要忘记将它添加到导入语句中。

您可以使用以下命令创建Calendar对象:

Calendar date = Calendar.getInstance();

该类的静态getInstance()方法Calendar创建一个Calendar用当前日期初始化的对象。您想要的日历将根据运行该程序的计算机的设置创建。

或者更准确地说,你得到的日历……那是因为地球上的人类并不局限于单一的日历。相反,他们使用了很多。几乎每个人都与某种宗教或国家有关。该类Calendar支持其中的 3 个:

日历 描述
公历 基督教公历
佛历 佛历
日本皇历 日本皇历

但也有中国和阿拉伯日历。基本上,处理时间并不像看起来那么容易。

在编写本课程时,中国历法的正式年份是 4716。根据伊斯兰历,年份是 1398 年。欢迎来到大世界,我的程序员朋友。

2.创建一个日历对象

我们将使用公历,因为它是世界上最通用的。至少在中国购买甲骨文并将中国日历作为主要日历之前。

您可以使用如下语句创建具有任何日期的日历对象:

Calendar date = new GregorianCalendar(year, month, day);

是的,你必须GregorianCalendar每次都写。除了Calendar,您还可以编写GregorianCalendar— 这也行得通。但是写作只是Calendar更短。

年份必须全写,例如,您不能用 19 代替 2019。月份仍然从零开始编号。但和以前一样,一个月中的天数不是从零开始编号的。书呆子!

要设置时间和日期,您需要将时间作为附加参数传递:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

如果需要,您甚至可以以毫秒为单位传递。它们是秒数之后的参数。

3. 在屏幕上显示一个日历对象

如果您只是在屏幕上打印一个日历对象,您将不会对结果很满意。

代码
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
控制台输出
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

这里要记住的是日历是日历,而不是日期:它有各种设置,都会显示在屏幕上。

SimpleDateFormat用一个对象来显示日历是合适的,但在我们研究它之前,你可以使用这个生活技巧。

Date date = calendar.getTime();

对象Calendar可以很容易地转换为Date对象,并且您已经知道如何显示Date对象。您可以使用这样的代码将Calendar对象转换为Date

使用getTime()方法:

代码 控制台输出
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

那是完全不同的事情,不是吗?

4. 处理日期元素

要获取日期的特定元素(例如年、月、...),该类Calendar具有get()方法。这是一个单一的方法,但它有参数:

int month = calendar.get(Calendar.MONTH);

其中calendarCalendar变量,MONTH是类的常量字段Calendar

您将类的常量字段之一Calendar作为参数传递给该get方法,并获得所需的值作为结果。

例子

代码 描述
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


纪元( 在 共同
纪元 之前 或 之后)






要更改日期的元素,请使用以下set方法:

calendar.set(Calendar.MONTH, value);

其中calendarCalendar变量,MONTH是类的常量字段Calendar

使用set方法时,将类的一个Calendar常量字段作为第一个参数传递,将新值作为第二个参数传递。

例子

代码 描述
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


年 = 2019
月 = 七月(从 0 开始编号)
第 4 天
小时
分钟

5.Calendar类的常量

该类的常量字段Calendar不限于用于命名日期元素的字段。似乎有适合各种场合的场地。

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

例如,有常量字段来引用月份:

还有星期几:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

我们不会列出所有内容。如果您在代码中看到这样的常量,我们只是不想让您感到惊讶。

使用常量使代码更具可读性,这就是程序员使用它们的原因。月份从零开始编号也是为了提高可读性。或不。

Calendar6. 更改对象中的日期

该类Calendar有一个方法可以让您以更智能的方式处理日期。例如,您可以向日期添加年、月或几天。或者把他们带走。此方法称为add()。使用它看起来像这样:

calendar.add(Calendar.MONTH, value);

其中calendarCalendar变量,MONTH是类的常量字段Calendar

使用add方法时,将类的一个Calendar常量字段作为第一个参数和第二个参数(要添加的新值)传递。

这是另一种智能方法。让我们看看它有多聪明:

代码
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
控制台输出
Fri Mar 01 00:00:00 EET 2019

此方法了解 2019 年 2 月只有 28 天,因此结果日期为 3 月 1 日。

现在让我们带走2个月!我们应该得到什么?2018 年 12 月 27 日!我们现在检查一下。

要执行导致更早日期的操作,您需要将负值传递给该add()方法:

代码
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
控制台输出
Thu Dec 27 00:00:00 EET 2018

有用!

这种方法考虑了月份和闰年的不同长度。总而言之,一个很棒的方法。这正是大多数使用日期的程序员所需要的。

7.日期的滚动元素

但有时在某些情况下我们不希望这种聪明的行为,例如,您想对日期的一部分做一些事情而不改变其他一切。

该类为此Calendar提供了特殊方法。roll()它的签名就像add()方法一样,但是这个方法只改变日期的一个元素,其余的保持不变。

例子:

代码
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
控制台输出
Fri Dec 27 00:00:00 EET 2019

我们更改了月份,但年份和日期保持不变。