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()
。
例子:
代码 | 控制台输出 |
---|---|
|
|
以下是控制台输出的含义:
文本 | 解释 |
---|---|
星期四_ | 周四 |
2月21日 | 2月21日 |
14:01:34 | 小时 : 分钟 : 秒 |
欧洲东部时间 | 时区:东欧时间 |
2019 | 年 |
3.设定具体日期
我们想出了如何获取当前时间,但我们如何创建一个Date
存储不同日期或时间的对象呢?
同样,这里的一切都很简单。要设置特定日期,您需要编写如下代码:
Date birthday = new Date(year, month, day);
一切都简单明了,但有两个细微差别需要注意:
- 年份必须从1900年开始计算。
- 月份从零开始编号。
这是 Unix 操作系统的另一个遗产:在 Unix 上,程序员使用两位数字表示年份。他们没有写 1977,而是简单地写了 77。因此,如果我们从 1900 年算起,77 是正确的年份。
比如我是1989年3月21日出生的,3月是第三个月,所以需要写:
代码 | 控制台输出 |
---|---|
|
|
月份是从零开始编号的,但日子不是,这有点奇怪,对吧?
我们认为真正的程序员应该占上风,并从零开始计算一个月中的天数。哦,这些循规蹈矩的人🙂
设定特定时间
设置特定时间也很简单:为此,您需要编写如下语句:
Date birthday = new Date(year, month, day, hour, minutes, seconds);
小时、分钟和秒从零开始编号:让您内心的程序员松一口气。
例子:
代码 | 控制台输出 |
---|---|
|
|
我们设置时间12:15和日期June 4, 2005。对于非程序员来说,这有点难以阅读,但它可以正常工作。
4. 处理日期元素
您可以对Date
对象做更多的事情,而不仅仅是显示它。它有一些方法可以让您获取内部存储日期的各个元素:
方法 | 描述 |
---|---|
|
返回日期相对于 1900 年的年份。 |
|
返回日期的月份(月份从零开始编号) |
|
返回一个月中的第几天 |
|
返回星期几 |
|
返回小时数 |
|
返回分钟 |
|
返回秒数 |
例子:
代码 | 控制台输出 | 笔记 |
---|---|---|
|
|
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
.
例子:
代码 |
---|
|
控制台输出 |
|
查看程序显示的内容: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");
我们将在其他课程中更详细地考虑字符串的解析。
GO TO FULL VERSION