JDK7以前的时间类
java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。
Date( )
第二个构造函数接收一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数。
Date(long millisec)
Date 对象创建以后,可以调用下面的方法。
方法 | 描述 |
1 boolean after(Date date) | 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。 |
2 boolean before(Date date) | 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。 |
3 Object clone( ) | 返回此对象的副本。 |
4 int compareTo(Date date) | 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。 |
5 int compareTo(Object obj) | 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。 |
6 boolean equals(Object date) | 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。 |
7 long getTime( ) | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 |
8 int hashCode( ) | 返回此对象的哈希码值。 |
9 void setTime(long time) | 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。 |
10 String toString( ) | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy |
获取当前日期时间
public static void main(String[] args) {
// 初始化 Date 对象
Date date = new Date();
// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
1.格式化:将时间转成指定格式
如yyyy-MM-dd HH:mm:ss
2.解析:把字符串表示的时间变成Date对象
public static void main(String[] args) {
//作用1
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE");
System.out.println(sdf1.format(date));
//作用2
String time = "2023-11-11 11:11:11";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf2.parse(time));
}
二、日期和时间的格式化编码
时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:
字母 | 描述 | 示例 |
G | 纪元标记 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M./P.M. (1~12)格式小时 | 12 |
H | 一天中的小时 (0~23) | 22 |
m | 分钟数 | 30 |
s | 秒数 | 55 |
S | 毫秒数 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2 (second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M./P.M. 标记 | PM |
k | 一天中的小时(1~24) | 24 |
K | A.M./P.M. (0~11)格式小时 | 10 |
z | 时区 | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 单引号 | ` |
三、使用printf格式化日期
printf 方法可以很轻松地格式化时间和日期。使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾。
转 换 符 | 说 明 | 示 例 |
c | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
F | "年-月-日"格式 | 2007-10-27 |
D | "月/日/年"格式 | 10/27/07 |
r | "HH:MM:SS PM"格式(12时制) | 02:25:51 下午 |
T | "HH:MM:SS"格式(24时制) | 14:28:16 |
R | "HH:MM"格式(24时制) | 14:28 |
在printf中输出日期
/*** 输出日期类型***/
// %t表示格式化日期时间类型,%T是时间日期的大写形式,在%t之后用特定的字母表示不同的输出格式
Date date = new Date();
long dataL = date.getTime();
// 格式化年月日
// %t之后用y表示输出日期的年份(2位数的年,如99)
// %t之后用m表示输出日期的月份,%t之后用d表示输出日期的日号
System.out.printf("%1$ty-%1$tm-%1$td; %2$ty-%2$tm-%2$td%n", date, dataL);
// %t之后用Y表示输出日期的年份(4位数的年),
// %t之后用B表示输出日期的月份的完整名, %t之后用b表示输出日期的月份的简称
System.out.printf("%1$tY-%1$tB-%1$td; %2$tY-%2$tb-%2$td%n", date, dataL);
// 以下是常见的日期组合
// %t之后用D表示以 "%tm/%td/%ty"格式化日期
System.out.printf("%1$tD%n", date);
//%t之后用F表示以"%tY-%tm-%td"格式化日期
System.out.printf("%1$tF%n", date);
/*** 输出时间类型***/
// 输出时分秒
// %t之后用H表示输出时间的时(24进制),%t之后用I表示输出时间的时(12进制),
// %t之后用M表示输出时间的分,%t之后用S表示输出时间的秒
System.out.printf("%1$tH:%1$tM:%1$tS; %2$tI:%2$tM:%2$tS%n", date, dataL);
// %t之后用L表示输出时间的秒中的毫秒
System.out.printf("%1$tH:%1$tM:%1$tS %1$tL%n", date);
// %t之后p表示输出时间的上午或下午信息
System.out.printf("%1$tH:%1$tM:%1$tS %1$tL %1$tp%n", date);
// 以下是常见的时间组合
// %t之后用R表示以"%tH:%tM"格式化时间
System.out.printf("%1$tR%n", date);
// %t之后用T表示以"%tH:%tM:%tS"格式化时间
System.out.printf("%1$tT%n", date);
// %t之后用r表示以"%tI:%tM:%tS %Tp"格式化时间
System.out.printf("%1$tr%n", date);
/*** 输出星期***/
// %t之后用A表示得到星期几的全称
System.out.printf("%1$tF %1$tA%n", date);
// %t之后用a表示得到星期几的简称
System.out.printf("%1$tF %1$ta%n", date);
// 输出时间日期的完整信息
System.out.printf("%1$tc%n", date);
/**
* 格式为"%t"表示输出时间日期类型."%t"之后用y表示输出日期的二位数的年份(如99)、用m
* 表示输出日期的月份,用d表示输出日期的日号;"%t"之后用Y表示输出日期的四位数的年份
* (如1999)、用B表示输出日期的月份的完整名,用b表示输出日期的月份的简称."%t"之后用D
* 表示以"%tm/%td/%ty"的格式输出日期、用F表示以"%tY-%tm-%td"的格式输出日期.
*/
/**
* "%t"之后用H表示输出时间的时(24进制),用I表示输出时间的时(12进制),用M表示输出时间
* 分,用S表示输出时间的秒,用L表示输出时间的秒中的毫秒数、用 p 表示输出时间的是上午还是
* 下午."%t"之后用R表示以"%tH:%tM"的格式输出时间、用T表示以"%tH:%tM:%tS"的格式输出
* 时间、用r表示以"%tI:%tM:%tS %Tp"的格式输出时间.
*/
/**
* "%t"之后用A表示输出日期的全称,用a表示输出日期的星期简称.
*/
Calendar类
一、为什么需要日历类
我们已经可以使用Date类来进行时分秒的计算,但如果涉及到年月日的计算又稍显麻烦,所以引入了Calendar类,其功能比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
二、注意点
Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程需要使用其内部的方法,只需要使用getInstance方法创建即可。
Calendar 类使用时要注意它的容错性和延迟性。
三、构造函数
创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期
创建一个指定日期的Calendar对象
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);
四、类中的常量
Calendar类中用以下这些常量表示不同的意义
常量 | 描述 |
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
五、成员方法
1.Set设置
public final void set(int year,int month,int date)
c1.set(2009, 6, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12
public void set(int field,int value)
c1.set(Calendar.DATE,12);//把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算
c1.set(Calendar.YEAR,2013);//把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算
2.Add增加
c1.add(Calendar.DATE, 10);
//把c1对象的日期加上10,也就是c1也就表示为10天后的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, -10);
//把c1对象的日期减去10,也就是c1也就表示为10天前的日期,其它所有的数值会被重新计算
3.Get获取
get(int field);
c1.get(Calendar.DATE);
//获取当前的日期
六、Calendar的容错性
调用Calendar对象的set()方法改变指定时间字段的值时,有可能传入一个不合法的参数,例如:为MONTH字段设置13,这将会导致什么结果呢?
//Calendar:容错性测试
@Test
public void testCalender() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
// Calendar容错性:true-打开;false-关闭
calendar.setLenient(false);
calendar.set(Calendar.MONTH, 13);
System.out.println("A="+simpleDateFormat.format(calendar.getTime())); // A标记
}
12345678910111213
当打开calendar.setLenient(true)时(默认):
A处代码可以正常运行,因为将MONTH字段设置为13,将会使YEAR字段计算加1;
输出结果:A=2020-02-12 13:59:33。
当关闭calendar.setLenient(false)时:
A处将会导致运行异常,因为设置的MONTH字段超出了所允许的范围。
关键在于程序中注释有“容错性”的代码行:
Calendar提供一个setLenient用于设置它的容错性,Calendar默认支持比较好的容错性,通过setLenient(false)关闭Calendar的容错性,让它进行严格的参数检查。
Calendar有两种解释日历字段的模式:lenient模式,non-lenient模式
当处于lenient模式时,每个字段都可接受超出范围的值;
当处于non-lenient模式时,每个字段都进行严格的参数检查,不接收超出字段的值。
七、set()的延迟性
set(int field, int value)方法日历的某个字段修改为value值,此外它还设置了一个内部成员变量,以指示日历字段field已经被更改。尽管日历字段field是立即更改的,但该Calendar所代表的事件却不会立即修改,直到下次调用get()、getTime()、getTimeInMillis()、add()或roll()时才会重新计算日历的时间。
这被称为set()方法的延迟修改,采用延迟修改的优势是多次调用set()不会触发多次不必要的运算,下面来看一个例子:
// set():延迟修改性
@Test
public void testCalender1() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(2019, 2, 31);
calendar.set(Calendar.MONTH, 8);
//包含getTime()方法,注释掉此行代码,运行结果截然不同
System.out.println("A="+simpleDateFormat.format(calendar.getTime())); // A标记
calendar.set(Calendar.DATE, 5);
System.out.println("B="+simpleDateFormat.format(calendar.getTime())); // B标记
}
123456789101112131415161718
打印结果:
- 注释掉 A行 之前:(set一次,get一次,一步一运算)
A=2019-10-01 13:27:55
B=2019-10-05 13:27:55
- 注释掉 A行 之后:(set两次,get一次,最后再运算)
B=2019-09-05 13:33:21
GregorianCalendar类
一、Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。
二、GregorianCalendar对象的几个构造方法:
序号 | 构造函数和说明 |
1 | GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。 |
2 | GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。 |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。 |
5 | GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar。 |
6 | GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。 |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar。 |
三、GregorianCalendar 类提供的一些方法列表:
序号 | 方法和说明 |
1 | void add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中。 |
2 | protected void computeFields() 转换UTC毫秒值为时间域值 |
3 | protected void computeTime() 覆盖Calendar ,转换时间域值为UTC毫秒值 |
4 | boolean equals(Object obj) 比较此 GregorianCalendar 与指定的 Object。 |
5 | int get(int field) 获取指定字段的时间值 |
6 | int getActualMaximum(int field) 返回当前日期,给定字段的最大值 |
7 | int getActualMinimum(int field) 返回当前日期,给定字段的最小值 |
8 | int getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值。 |
9 | Date getGregorianChange() 获得格里高利历的更改日期。 |
10 | int getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值 |
11 | int getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值。 |
12 | Date getTime() 获取日历当前时间。 |
13 | long getTimeInMillis() 获取用长整型表示的日历的当前时间 |
14 | TimeZone getTimeZone() 获取时区。 |
15 | int getMinimum(int field) 返回给定字段的最小值。 |
16 | int hashCode() 重写hashCode. |
17 | boolean isLeapYear(int year) 确定给定的年份是否为闰年。 |
18 | void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。 |
19 | void set(int field, int value) 用给定的值设置时间字段。 |
20 | void set(int year, int month, int date) 设置年、月、日的值。 |
21 | void set(int year, int month, int date, int hour, int minute) 设置年、月、日、小时、分钟的值。 |
22 | void set(int year, int month, int date, int hour, int minute, int second) 设置年、月、日、小时、分钟、秒的值。 |
23 | void setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期。 |
24 | void setTime(Date date) 用给定的日期设置Calendar的当前时间。 |
25 | void setTimeInMillis(long millis) 用给定的long型毫秒数设置Calendar的当前时间。 |
26 | void setTimeZone(TimeZone value) 用给定时区值设置当前时区。 |
27 | String toString() 返回代表日历的字符串。 |
四、实例
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String[] args) {
String months[] = {
"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};
int year;
// 初始化 Gregorian 日历
// 使用当前时间和日期
// 默认为本地时间和时区
GregorianCalendar gcalendar = new GregorianCalendar();
// 显示当前时间和日期的信息
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// 测试当前年份是否为闰年
if(gcalendar.isLeapYear(year)) {
System.out.println("当前年份是闰年");
}
else {
System.out.println("当前年份不是闰年");
}
}
}
以上实例编译运行结果如下:
Date: Apr 22 2009
Time: 11:25:27
当前年份不是闰年
关于 Calendar 类的完整列表,可以参考标准的 Java文档。
JDK8之后新增的时间类
案例一:
判断一个时间是否在指定时间区间内
如果在JDK7及以前,需要将时间转换为毫秒值,再进行数值判断
但是到了JDK8之后,可以直接定义开始时间和结束时间对象,然后调用方法进行比较
LocalDateTime start = LocalDateTime.of(2022, 7, 8, 7, 20, 0);
LocalDateTime end = LocalDateTime.of(2023, 11, 11, 0, 10, 0);
LocalDateTime order = LocalDateTime.of(2023, 11, 11, 0, 0, 3);
if (start.isBefore(order) && end.isAfter(order)) {
System.out.println("成功参加");
} else {
System.out.println("参加失败");
}
在JDK8之后,代码更加简洁,安全性更高(将Date对象设置为不可修改,避免了多线程下数据修改问题)
ZoneId类
方法:
变量和类型 | 方法 | 描述 |
boolean | equals(Object obj) | 检查此时区ID是否等于另一个时区ID。 |
static ZoneId | from(TemporalAccessor temporal) | 从时态对象获得 ZoneId 的实例。 |
static Set<String> | getAvailableZoneIds() | 获取可用区域ID的集合。 |
String | getDisplayName(TextStyle style, Locale locale) | 获取区域的文本表示,例如“British Time”或“+02:00”。 |
abstract String | getId() | 获取唯一的时区ID。 |
abstract ZoneRules | getRules() | 获取此ID的时区规则,允许执行计算。 |
int | hashCode() | 此时区ID的哈希码。 |
ZoneId | normalized() | 规范化时区ID,尽可能返回 ZoneOffset 。 |
static ZoneId | of(String zoneId) | 从ID获取 ZoneId 的实例,确保该ID有效且可供使用。 |
static ZoneId | of(String zoneId, Map<String,String> aliasMap) | 使用别名映射使用其ID获取 ZoneId 的实例以补充标准区域ID。 |
static ZoneId | ofOffset(String prefix, ZoneOffset offset) | 获得包装偏移量的 ZoneId 的实例。 |
static ZoneId | systemDefault() | 获取系统默认时区。 |
String | toString() | 使用ID将此区域输出为 String 。 |
//在JDK8之后,代码更加简洁,安全性更高(将Date对象设置为不可修改,避免了多线程下数据修改问题)
//ZoneId类:
Set<String> zoneId1 = ZoneId.getAvailableZoneIds();
System.out.println(zoneId1);
ZoneId zoneId2 = ZoneId.systemDefault();
System.out.println(zoneId2);
ZoneId zoneId3 = ZoneId.of("Asia/Pontianak");
System.out.println(zoneId3);
Instant类
一、什么是Instant类
表示一个固定时间对象
二、方法摘要
变量和类型 | 方法 | 描述 |
Temporal | adjustInto(Temporal temporal) | 调整指定的时态对象以获得此瞬间。 |
OffsetDateTime | atOffset(ZoneOffset offset) | 将此瞬间与偏移量组合以创建 OffsetDateTime 。 |
ZonedDateTime | atZone(ZoneId zone) | 将此瞬间与时区相结合以创建 ZonedDateTime 。 |
int | compareTo(Instant otherInstant) | 将此瞬间与指定的瞬间进行比较。 |
boolean | equals(Object otherInstant) | 检查此瞬间是否等于指定的瞬间。 |
static Instant | from(TemporalAccessor temporal) | 从时态对象获得 Instant 的实例。 |
int | get(TemporalField field) | 以 int 获取此瞬间指定字段的值。 |
long | getEpochSecond() | 获取1970-01-01T00:00:00Z的Java纪元的秒数。 |
long | getLong(TemporalField field) | 从此瞬间获取指定字段的值,如 long 。 |
int | getNano() | 从时间线开始,获取从第二个开始的纳秒数。 |
int | hashCode() | 返回此瞬间的哈希码。 |
boolean | isAfter(Instant otherInstant) | 检查此瞬间是否在指定的瞬间之后。 |
boolean | isBefore(Instant otherInstant) | 检查此瞬间是否在指定的瞬间之前。 |
boolean | isSupported(TemporalField field) | 检查是否支持指定的字段。 |
boolean | isSupported(TemporalUnit unit) | 检查指定的单元是否受支持。 |
Instant | minus(long amountToSubtract, TemporalUnit unit) | 返回此瞬间的副本,并减去指定的数量。 |
Instant | minus(TemporalAmount amountToSubtract) | 返回此瞬间的副本,并减去指定的数量。 |
Instant | minusMillis(long millisToSubtract) | 返回此瞬间的副本,并减去指定的持续时间(以毫秒为单位)。 |
Instant | minusNanos(long nanosToSubtract) | 返回此瞬间的副本,并减去指定的持续时间(以纳秒为单位)。 |
Instant | minusSeconds(long secondsToSubtract) | 返回此瞬间的副本,并减去指定的持续时间(以秒为单位)。 |
static Instant | now() | 从系统时钟获取当前瞬间。 |
static Instant | now(Clock clock) | 从指定时钟获取当前时刻。 |
static Instant | ofEpochMilli(long epochMilli) | 从1970-01-01T00:00:00Z的纪元使用毫秒获得 Instant 的实例。 |
static Instant | ofEpochSecond(long epochSecond) | 使用1970-01-01T00:00:00Z时代的秒数获得 Instant 的实例。 |
static Instant | ofEpochSecond(long epochSecond, long nanoAdjustment) | 使用1970-01-01T00:00:00Z的时间秒和秒的纳秒分数获得 Instant 的实例。 |
static Instant | parse(CharSequence text) | 从文本字符串(例如 2007-12-03T10:15:30.00Z 获取 Instant 的实例。 |
Instant | plus(long amountToAdd, TemporalUnit unit) | 返回此瞬间的副本,并添加指定的数量。 |
Instant | plus(TemporalAmount amountToAdd) | 返回此瞬间的副本,并添加指定的数量。 |
Instant | plusMillis(long millisToAdd) | 返回此瞬间的副本,并添加指定的持续时间(以毫秒为单位)。 |
Instant | plusNanos(long nanosToAdd) | 返回此瞬间的副本,并添加指定的持续时间(以纳秒为单位)。 |
Instant | plusSeconds(long secondsToAdd) | 返回此瞬间的副本,并添加指定的持续时间(以秒为单位)。 |
<R> R | query(TemporalQuery<R> query) | 使用指定的查询查询此瞬间。 |
ValueRange | range(TemporalField field) | 获取指定字段的有效值范围。 |
long | toEpochMilli() | 将此瞬间转换为1970-01-01T00:00:00Z时代的毫秒数。 |
String | toString() | 使用ISO-8601表示的此瞬间的字符串表示。 |
Instant | truncatedTo(TemporalUnit unit) | 返回截断到指定单位的此 Instant 的副本。 |
long | until(Temporal endExclusive, TemporalUnit unit) | 根据指定的单位计算到另一个瞬间的时间量。 |
Instant | with(TemporalAdjuster adjuster) | 返回此瞬间的调整副本。 |
Instant | with(TemporalField field, long newValue) | 返回此瞬间的副本,并将指定的字段设置为新值。 |
Instant instant = Instant.now();
System.out.println(instant);
System.out.println(instant.hashCode());
ZonedDateTime类
ZonedDateTime
是具有时区的日期时间的不可变表示。 此类存储所有日期和时间字段,精度为纳秒和时区,区域偏移用于处理模糊的本地日期时间。 例如,值“2007年10月2日13:45.30.123456789 + 02:00在欧洲/巴黎时区”可以存储在ZonedDateTime
。
此类处理从本地时间线LocalDateTime
到即时时间线Instant
。 两个时间线之间的差异是UTC /格林威治的偏移量,由ZoneOffset
表示。
在两个时间线之间转换涉及使用从ZoneId访问的ZoneId
计算偏移量。 瞬间获得偏移量很简单,因为每个瞬间只有一个有效偏移量。 相反,获得本地日期时间的偏移量并不简单。 有三种情况:
- 正常,有一个有效的偏移量。 对于一年中的绝大多数情况,正常情况适用,其中本地日期时间有一个有效的偏移量。
- 差距,零有效偏移。 这是因为春天夏令时从“冬天”变为“夏天”,时钟向前跳跃。 在间隙中,存在没有有效偏移的本地日期时间值。
- 重叠,有两个有效的偏移量。 这是因为秋季夏令时从“夏季”变为“冬季”,因此时钟被缩回。 在重叠中,存在具有两个有效偏移的本地日期时间值。
方法摘要
变量和类型 | 方法 | 描述 |
boolean | equals(Object obj) | 检查此日期时间是否等于另一个日期时间。 |
String | format(DateTimeFormatter formatter) | 使用指定的格式化程序格式化此日期时间。 |
static ZonedDateTime | from(TemporalAccessor temporal) | 从时态对象获得 ZonedDateTime 的实例。 |
int | get(TemporalField field) | 从此日期时间获取指定字段的值为 int 。 |
int | getDayOfMonth() | 获取日期字段。 |
DayOfWeek | getDayOfWeek() | 获取星期几字段,即枚举 DayOfWeek 。 |
int | getDayOfYear() | 获取日期字段。 |
int | getHour() | 获取当日时间字段。 |
long | getLong(TemporalField field) | 从此日期时间获取指定字段的值,作为 long 。 |
int | getMinute() | 获取分钟字段。 |
Month | getMonth() | 使用 Month 枚举获取年份字段。 |
int | getMonthValue() | 获取1到12之间的月份字段。 |
int | getNano() | 获取纳秒级字段。 |
ZoneOffset | getOffset() | 获取区域偏移量,例如“+01:00”。 |
int | getSecond() | 获取第二分钟字段。 |
int | getYear() | 获取年份字段。 |
ZoneId | getZone() | 获取时区,例如“Europe / Paris”。 |
int | hashCode() | 此日期时间的哈希码。 |
boolean | isSupported(TemporalField field) | 检查是否支持指定的字段。 |
boolean | isSupported(TemporalUnit unit) | 检查指定的单元是否受支持。 |
ZonedDateTime | minus(long amountToSubtract, TemporalUnit unit) | 返回此日期时间的副本,并减去指定的数量。 |
ZonedDateTime | minus(TemporalAmount amountToSubtract) | 返回此日期时间的副本,并减去指定的数量。 |
ZonedDateTime | minusDays(long days) | 返回此 ZonedDateTime 的副本,并减去指定的天数。 |
ZonedDateTime | minusHours(long hours) | 返回此 ZonedDateTime 的副本,并减去指定的小时数。 |
ZonedDateTime | minusMinutes(long minutes) | 返回此 ZonedDateTime 的副本,并减去指定的分钟数。 |
ZonedDateTime | minusMonths(long months) | 返回此 ZonedDateTime 的副本,并减去指定的月数。 |
ZonedDateTime | minusNanos(long nanos) | 返回此 ZonedDateTime 的副本,减去指定的纳秒数。 |
ZonedDateTime | minusSeconds(long seconds) | 返回此 ZonedDateTime 的副本,并减去指定的秒数。 |
ZonedDateTime | minusWeeks(long weeks) | 返回此 ZonedDateTime 的副本,并减去指定的周数。 |
ZonedDateTime | minusYears(long years) | 返回此 ZonedDateTime 的副本,并减去指定的年数。 |
static ZonedDateTime | now() | 从默认时区中的系统时钟获取当前日期时间。 |
static ZonedDateTime | now(Clock clock) | 从指定的时钟获得当前日期时间。 |
static ZonedDateTime | now(ZoneId zone) | 从指定时区的系统时钟获取当前日期时间。 |
static ZonedDateTime | of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone) | 从年,月,日,小时,分钟,秒,纳秒和时区获得 ZonedDateTime 的实例。 |
static ZonedDateTime | of(LocalDate date, LocalTime time, ZoneId zone) | 从本地日期和时间获得 ZonedDateTime 的实例。 |
static ZonedDateTime | of(LocalDateTime localDateTime, ZoneId zone) | 从本地日期时间获得 ZonedDateTime 的实例。 |
static ZonedDateTime | ofInstant(Instant instant, ZoneId zone) | 从 Instant 获得 ZonedDateTime 的实例。 |
static ZonedDateTime | ofInstant(LocalDateTime localDateTime, ZoneOffset offset, ZoneId zone) | 从通过组合本地日期时间和偏移量形成的瞬间获得 ZonedDateTime 的实例。 |
static ZonedDateTime | ofLocal(LocalDateTime localDateTime, ZoneId zone, ZoneOffset preferredOffset) | 如果可能,使用首选偏移量从本地日期时间获取 ZonedDateTime 的实例。 |
static ZonedDateTime | ofStrict(LocalDateTime localDateTime, ZoneOffset offset, ZoneId zone) | 获得 ZonedDateTime 的实例,严格验证本地日期时间,偏移量和区域ID的组合。 |
static ZonedDateTime | parse(CharSequence text) | 从文本字符串(如 2007-12-03T10:15:30+01:00[Europe/Paris] 获取 ZonedDateTime 的实例。 |
static ZonedDateTime | parse(CharSequence text, DateTimeFormatter formatter) | 使用特定格式化程序从文本字符串中获取 ZonedDateTime 的实例。 |
ZonedDateTime | plus(long amountToAdd, TemporalUnit unit) | 返回此日期时间的副本,并添加指定的数量。 |
ZonedDateTime | plus(TemporalAmount amountToAdd) | 返回此日期时间的副本,并添加指定的数量。 |
ZonedDateTime | plusDays(long days) | 返回此 ZonedDateTime 的副本,并添加指定的天数。 |
ZonedDateTime | plusHours(long hours) | 返回此 ZonedDateTime 的副本,并添加指定的小时数。 |
ZonedDateTime | plusMinutes(long minutes) | 返回此 ZonedDateTime 的副本,并添加指定的分钟数。 |
ZonedDateTime | plusMonths(long months) | 返回此 ZonedDateTime 的副本,并添加指定的月数。 |
ZonedDateTime | plusNanos(long nanos) | 返回此 ZonedDateTime 的副本, ZonedDateTime 添加了指定的纳秒数。 |
ZonedDateTime | plusSeconds(long seconds) | 返回此 ZonedDateTime 的副本,并添加指定的秒数。 |
ZonedDateTime | plusWeeks(long weeks) | 返回此 ZonedDateTime 的副本,并添加指定的周数。 |
ZonedDateTime | plusYears(long years) | 返回此 ZonedDateTime 的副本,并添加指定的年数。 |
<R> R | query(TemporalQuery<R> query) | 使用指定的查询查询此日期时间。 |
ValueRange | range(TemporalField field) | 获取指定字段的有效值范围。 |
LocalDate | toLocalDate() | 获取此日期时间的 LocalDate 部分。 |
LocalDateTime | toLocalDateTime() | 获取此日期时间的 LocalDateTime 部分。 |
LocalTime | toLocalTime() | 获取此日期时间的 LocalTime 部分。 |
OffsetDateTime | toOffsetDateTime() | 将此日期时间转换为 OffsetDateTime 。 |
String | toString() | 将此日期时间输出为 String ,例如 2007-12-03T10:15:30+01:00[Europe/Paris] 。 |
ZonedDateTime | truncatedTo(TemporalUnit unit) | 返回此 ZonedDateTime 的副本,并截断时间。 |
long | until(Temporal endExclusive, TemporalUnit unit) | 根据指定的单位计算到另一个日期时间的时间量。 |
ZonedDateTime | with(TemporalAdjuster adjuster) | 返回此日期时间的调整副本。 |
ZonedDateTime | with(TemporalField field, long newValue) | 返回此日期时间的副本,并将指定字段设置为新值。 |
ZonedDateTime | withDayOfMonth(int dayOfMonth) | 返回此 ZonedDateTime 的副本,并更改日期。 |
ZonedDateTime | withDayOfYear(int dayOfYear) | 返回此 ZonedDateTime 的副本,并更改日期。 |
ZonedDateTime | withEarlierOffsetAtOverlap() | 返回此日期时间的副本,将区域偏移更改为本地时间线重叠处的两个有效偏移中较早的一个。 |
ZonedDateTime | withFixedOffsetZone() | 返回此日期时间的副本,并将区域ID设置为偏移量。 |
ZonedDateTime | withHour(int hour) | 返回此 ZonedDateTime 的副本,并更改日期。 |
ZonedDateTime | withLaterOffsetAtOverlap() | 返回此日期时间的副本,将区域偏移更改为本地时间线重叠处的两个有效偏移中的较晚者。 |
ZonedDateTime | withMinute(int minute) | 返回此 ZonedDateTime 的副本,并更改了分钟。 |
ZonedDateTime | withMonth(int month) | 返回此 ZonedDateTime 的副本,其中年份已更改。 |
ZonedDateTime | withNano(int nanoOfSecond) | 返回此 ZonedDateTime 的副本,并更改了纳秒。 |
ZonedDateTime | withSecond(int second) | 返回此 ZonedDateTime 的副本,并在第二分钟更改。 |
ZonedDateTime | withYear(int year) | 返回此 ZonedDateTime 的副本,并更改年份。 |
ZonedDateTime | withZoneSameInstant(ZoneId zone) | 使用不同的时区返回此日期时间的副本,保留该瞬间。 |
ZonedDateTime | withZoneSameLocal(ZoneId zone) | 使用不同的时区返回此日期时间的副本,如果可能,保留本地日期时间。 |
ZonedDateTime time = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(time));