java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
Date
构造函数使用当前日期和时间来初始化对象。
Date()
构造函数接收一个参数,该参数是从 1970 年 1 月 1 日零时起的毫秒数。
Date(long millisec)
Date 对象被构建以后,有很多实用的方法可以便于操作日期时间:
虽然 Date 还有很多构造函数可以方便地构造出时间,但是他们都被标注上了 @Deprecated ,并建议使用 Calendar 类来生成时间。
方法签名 | 释义 |
---|---|
boolean after(Date date) | 时间比较,传入的时间是否在指定时间之后 |
boolean before(Date date) | 时间比较,传入的时间是否在指定时间之前 |
int compareTo(Object obj) | 时间比较,传入的时间在指定时间之前为 1,在之后为 -1, 相等为 0 |
long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 |
void setTime(long time) | 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期 |
日期/时间格式化
在 Java 中,可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期。
DateFormat 类
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。在创建 DateFormat 对象时不能使用 new 关键字,而应该使用 DateFormat 类中的静态方法 getDateInstance()
。
DateFormat df = DateFormat.getDatelnstance();
private static void dateFormat(){
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
DateFormat df2 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINESE);
String date1 = df1.format(new Date());
String date2 = df2.format(new Date());
String date3 = df3.format(new Date());
System.out.println("date1 " + date1);
System.out.println("date2 " + date2);
System.out.println("date3 " + date3);
}
date2 2022年3月26日 星期六
date3 2022年3月26日
SimpleDateFormat 类
如果使用 DateFormat 类格式化日期/时间并不能满足要求,那么就需要使用 DateFormat 类的子类——SimpleDateFormat。
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类,它允许进行格式化(日期→文本)、解析(文本→日期)和规范化。SimpleDateFormat 使得用户可以选择任何自定义的日期/时间格式的格式。
SimpleDateFormat 类主要有如下 3 种构造方法。
- SimpleDateFormat():用默认的格式和默认的语言环境构造 SimpleDateFormat。
- SimpleDateFormat(String pattern):用指定的格式和默认的语言环境构造 SimpleDateFormat。
- SimpleDateFormat(String pattern,Locale locale):用指定的格式和指定的语言环境构造 SimpleDateFormat。
pattern 中常用的字母及含义:
字母 | 含义 | 示例 |
---|---|---|
G | Era 纪元标记 | AD |
y | 年份:yy 表示两位年份,yyyy 表示 4 位年份 | yy 表示年扮,如 11 yyyy 表示的年份,如 2011 |
M | 年中的月份:MM 表示月份, MMM 会根据语言环境显示不同语言的月份 | MM 表示的月份,如 05 MMM 表示月份,在 Locale.CHINA语言环境下,如“五月”;在 Locale.US 语言环境下,如 May |
w | 年中的周数 | |
W | 月中的周数 | |
D | 年中的天数 | |
d | 月份中的天数 | |
F | 月份中的星期 | |
E | 星期中的天数 | |
a | am/pm 标记 | |
H | 一天中的小时数(0-23) | |
h | 一天中的小时数(1-12) | |
K | am/pm 中的小时数(0-11) | |
k | am/pm 中的小时数(1-12) | |
m | 小时中的分钟数 | 使用 mm 表示的分钟数,如 12 |
s | 分钟中的秒数 | 使用 ss 表示的秒数,如 25 |
S | 毫秒数 | 使用 SSS 表示的毫秒数,如 235 |
z | 时区 | Eastern Standard Time |
Z | 时区 |
private static void simpleFormat() throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 日期转字符串
String date1 = df.format(new Date());
System.out.println(date1);
// 字符串转日期
Date parse = df.parse(date1);
System.out.println(parse);
}
DateTimeFormatter
SimpleDateFormat 的确非常强大,几乎能转换各种格式的日期时间,但是它是线程不安全的。并发场景下,如果不注意写法,容易出现线程安全问题。虽然可以使用 ThreadLocal 等方式解决,但是毕竟代码写起来稍显复杂,为此,在 java8 以后,jdk 中增加了 DateTimeFormatter
来处理日期时间格式化。
private static void datetimeFormat(){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parse = LocalDateTime.parse("2022-03-26 17:27:32", formatter);
System.out.println(parse);
}
如果是JDK8的应用,可以使用 Instant 代替Date,Localdatetime代替Calendar,Datetimeformatter代替Simpledateformatter。
Calendar
Date 类可以满足绝大多数的日期时间场景,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 此时就需要用到 Calendar 类。
Calendar 类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用 getInstance()
方法创建即可。
Calendar cal = Calendar.getInstance();//默认是当前日期
可以通过下面的方式指定日期:
cal.set(2022, 3, 22);
这里设置的 2022 年 4 月 22 日。需要注意的是,月份是从 0 开始的,如果设置为 1 月 15 号,应该这么写:
cal.set(2022, 0, 15);