1.Date类和Unix时间

从 Java 一开始,该语言就有一个用于处理时间和日期的特殊类 — Date. 随着时间的推移,出现了更多用于处理日期的类,但Date即使在今天,程序员仍在继续使用该类。

这是因为它非常简单方便。而作为一个程序员,你肯定会在任何一个真实的项目中遇到它。是否使用它是您的选择,但您必须知道它。所以给它几分钟宝贵的时间。

是什么让Date课堂如此精彩?它的简单性。

该类Date将日期和时间信息存储为自 1970 年 1 月 1 日以来经过的毫秒数。这是很多毫秒,因此该long类型用于存储它们。

有趣的。

为什么特别是从 1970 年开始?这就是所谓的Unix 时间:所有现代操作系统的鼻祖 Unix 操作系统就是这样计时的。

但是你可以很容易地找出两个日期之间经过了多少时间:只需从另一个日期中减去一个日期,你就可以得到日期之间的时间差,精确到毫秒。

这里有一些与班级一起工作的有用例子Date


2.获取当前日期

要获取当前时间和日期,只需创建一个Date对象。每个新对象都存储其创建时间。它看起来很简单:

Date current = new Date();

执行此命令后,该current变量将存储对已创建对象的引用Date,该对象将在内部存储其创建时间——自 1970 年 1 月 1 日起经过的毫秒数。

在屏幕上显示当前日期

要显示当前日期,只需:a) 创建一个新Date对象,b) 使用方法将其打印到屏幕上System.out.println()

例子:

代码 控制台输出
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

以下是控制台输出的含义:

文本 解释
星期四_ 周四
2月21日 2月21日
14:01:34 小时 : 分钟 : 秒
欧洲东部时间 时区:东欧时间
2019

3.设定具体日期

我们想出了如何获取当前时间,但我们如何创建一个Date存储不同日期或时间的对象呢?

同样,这里的一切都很简单。要设置特定日期,您需要编写如下代码:

Date birthday = new Date(year, month, day);

一切都简单明了,但有两个细微差别需要注意:

  1. 年份必须从1900年开始计算。
  2. 月份从零开始编号。
有趣的。

这是 Unix 操作系统的另一个遗产:在 Unix 上,程序员使用两位数字表示年份。他们没有写 1977,而是简单地写了 77。因此,如果我们从 1900 年算起,77 是正确的年份。

比如我是1989年3月21日出生的,3月是第三个月,所以需要写:

代码 控制台输出
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

月份是从零开始编号的,但日子不是,这有点奇怪,对吧?

我们认为真正的程序员应该占上风,并从零开始计算一个月中的天数。哦,这些循规蹈矩的人🙂

设定特定时间

设置特定时间也很简单:为此,您需要编写如下语句:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

小时、分钟和秒从零开始编号:让您内心的程序员松一口气。

例子:

代码 控制台输出
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

我们设置时间12:15和日期June 4, 2005。对于非程序员来说,这有点难以阅读,但它可以正常工作。


4. 处理日期元素

您可以对Date对象做更多的事情,而不仅仅是显示它。它有一些方法可以让您获取内部存储日期的各个元素:

方法 描述
int getYear()
返回日期相对于 1900 年的年份。
int getMonth()
返回日期的月份(月份从零开始编号)
int getDate()
返回一个月中的第几天
int getDay()
返回星期几
int getHours()
返回小时数
int getMinutes()
返回分钟
int getSeconds()
返回秒数

例子:

代码 控制台输出 笔记
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005 年
6

星期六

顺便说一句,一个Date对象不仅可以让你获得日期的各个元素,还可以改变它们:

方法 描述
void setYear(int year) 更改日期的年份。年份是相对于 1900 年表示的。
void setMonth(int month) 更改日期的月份(月份从零开始编号)
void setDate(int date) 更改月份中的日期
void setHours(int hours) 更改时间
void setMinutes(int minutes) 更改分钟
void setSeconds(int seconds) 秒变

5. 毫秒

正如我们之前所说,该Date对象存储自 1970 年 1 月 1 日以来经过的毫秒数。

如果我们需要那个数字,我们可以从对象中获取它Date

long time = date.getTime();

getTime()方法返回存储在对象内的毫秒数Date

您不仅可以获得毫秒数,还可以在现有对象中更改该数字:

Date date = new Date();
date.setTime(1117876500000L);

Date顺便说一句,您可以通过在创建对象时将时间传递给对象来更简洁地编写它:

Date date = new Date(1117876500000L);

6.比较日期

如果你想比较两个日期并找出哪个日期先到,你有三种选择

一种方式是简单比较它们各自存储的毫秒数:

if (date1.getTime() < date2.getTime())

第二种方式是使用对象before()的方法Date

if (date1.before(date2))

它是这样写的:如果date1出现在 之前date2,那么......

第三种方式是使用对象after()的方法Date

if (date2.after(date1))

它是这样写的:如果date2在之后date1,那么......


7.DateFormat

记住,当我们在屏幕上显示日期时,我们看到了这样的东西:Thu Feb 21 14:01:34 EET 2019。一切似乎都是正确的,但格式更像是为程序员而不是普通人显示日期的方式。我们希望为用户更清楚地显示日期。类似的东西Tuesday, February 21

并且没有年份。或如有必要,一年。通常,我们希望能够以不同的方式显示日期。

为此有一个特殊的类:SimpleDateFormat.

例子:

代码
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
控制台输出
Jun-04-2005

查看程序显示的内容:Jun-04-2005。这根本不是过去的样子。

不同的是,我们显示的不是对象本身,而是通过调用对象的方法Date获得的特殊字符串。但这甚至不是这里的重点。format()SimpleDateFormat

SimpleDateFormat创建对象时,我们将字符串"MMM-dd-YYYY"作为参数传入。正是这个字符串传达了我们最终在控制台输出中看到的日期格式。

  • MMM 表示显示月份名称,用三个字母缩写
  • dd 表示显示月中的第几天
  • YYYY表示用四位数字显示年份

如果我们想将月份输出为数字,那么MMM我们需要写MM,而不是 ,这会产生模式"MM-dd-YYYY"。屏幕输出将是06-04-2005

稍后我们将更详细地讨论这个类。


8.Date.parse方法

该类Date可以做一些其他有趣且有用的事情——它可以从字符串中获取日期。或者,如程序员所说,它可以解析一个字符串。

parse()它对此有特殊的方法。解析看起来像这样:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

顺便说一句,这段代码可以写得更紧凑:

Date date = new Date("Jul 06 12:15:00 2019");

我们将在其他课程中更详细地考虑字符串的解析。