具体信息请查看 API 帮助文档
Date类
1. ZoneID类
ZoneID类是Java中的一个类,位于java.time包中,用于表示时区的标识符。
-
时区是以相对于协调世界时(Coordinated Universal Time,UTC)的偏移量来表示地球上不同地区的时间差异。ZoneID类提供了一组静态方法和常量,用于获取和表示时区的标识符。
-
通过ZoneID类,可以获取当前系统默认的时区,也可以根据特定地区的标识符获取对应的时区。它还可以通过偏移量创建自定义的时区。
-
ZoneID类还与其他日期和时间类紧密配合,可以将日期和时间对象转换为特定时区下的日期和时间,或者将特定时区下的日期和时间转换为其他时区。
需要注意的是,ZoneID类提供的时区标识符是根据区域性的命名约定来命名的,比如"America/New_York"、“Asia/Shanghai"等,而不是简单的”+/-时差的小时数"。
1.1 方法
ZoneId类:时区
静态方法 | 描述 |
---|---|
getAvailableZoneIds() |
获取Java中支持的所有时区的标识符 |
systemDefault() |
获取系统默认时区的标识符 |
of(String zoneId) |
根据指定的时区标识符获取ZoneId对象 |
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
1.2 代码示例
package text;
import java.time.ZoneId;
import java.util.Set;
/*
ZoneId类:时区
static Set<string> getAvailableZoneIds() 获取Java中支持的所有时区
static ZoneId systemDefault() 获取系统默认时区
static Zoneld of(string zoneld) 获取一个指定时区
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
*/
public class text89 {
public static void main(String[] args) {
//获取支持的时区
Set<String> set = ZoneId.getAvailableZoneIds();
//打印集合
System.out.println(set);//[Asia/Aden,…… US/Pacific, Europe/Monaco]
//获取集合的长度
System.out.println(set.size()); //603
//获取系统默认的时区
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId); //Asia/Shanghai
//获取一个指定的时区
ZoneId of = ZoneId.of("US/Pacific");
System.out.println(of); //US/Pacific
}
}
2. Instant类
Instant类是Java中的一个类,位于java.time包中,用于表示时间戳。时间戳是距离1970年1月1日UTC时间的秒数或纳秒数。
-
Instant类提供了一组方法,用于处理和操作时间戳。它可以表示从1970年1月1日起的精确时间,以纳秒为单位。Instant类是不可变的,也就是说,一旦创建了一个Instant对象,就不能修改它的值。
-
通过Instant类,可以获取当前的系统时间戳,也可以根据指定的时间戳值创建Instant对象。它还支持与其他日期和时间类的相互转换,可以将Instant对象转换为特定时区下的日期和时间,或者将特定时区下的日期和时间转换为Instant对象。
需要注意的是,Instant类是与计算机系统的时间概念相关的,它与时区无关,并以协调世界时(Coordinated Universal Time,UTC)为基准。
2.1 方法
Instant类:时间戳
静态方法 | 描述 |
---|---|
now() |
获取当前标准时间的Instant对象 |
ofEpochMilli(long epochMilli) |
根据指定的毫秒数获取Instant对象 |
ofEpochSecond(long epochSecond) |
根据指定的秒数获取Instant对象 |
ofEpochSecond(long epochSecond, long nanoAdjustment) |
根据指定的秒数和纳秒数获取Instant对象 |
实例方法 | 描述 |
---|---|
ZonedDateTime atZone(ZoneId zone) |
将Instant对象转换为指定时区的ZonedDateTime对象 |
boolean isXxx(Instant otherInstant) |
判断当前Instant对象是否满足指定条件 |
Instant minusXxx(long millisToSubtract) |
从当前Instant对象减去指定的时间间隔 |
Instant plusXxx(long millisToAdd) |
在当前Instant对象上增加指定的时间间隔 |
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
2.2 代码示例
package text;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
/*
Instant类:时间戳
static Instant now() 获取当前时间的Instant对象(标准时间)
static Instant ofXxxx(long epochMilli) 根据(秒/毫秒/纳秒)获取Instant对象
//以下方法不是静态方法,因此需要创建对象再使用
ZonedDateTime atZone(ZoneIdzone) 指定时区
boolean isxxx(Instant otherInstant) 判断系列的方法
Instant minusXxx(long millisToSubtract) 减少时间系列的方法
Instant plusXxx(long millisToSubtract) 增加时间系列的方法
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
*/
public class text90 {
public static void main(String[] args) {
//获取当前时间的Instant对象(标准时间)
Instant now = Instant.now();
System.out.println(now); //2024-01-21T08:06:42.049Z
//根据(秒/毫秒/纳秒)获取Instant对象
Instant instant1 = Instant.ofEpochSecond(1l); //根据秒获取Instant对象
Instant instant2 = Instant.ofEpochMilli(2000l); // 根据毫秒获取Instant对象
Instant instant3 = Instant.ofEpochSecond(2l, 1000000000l); //根据纳秒获取Instant对象
System.out.println(instant1); //1970-01-01T00:00:01Z
System.out.println(instant2); //1970-01-01T00:00:02Z
System.out.println(instant3); //1970-01-01T00:00:03Z
//指定时区
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime); //2024-01-21T16:12:10.778+08:00[Asia/Shanghai]
//判断系列方法
//获取对象
Instant instant4 = Instant.ofEpochSecond(1l);
Instant instant5 = Instant.ofEpochSecond(2l);
//isAfter:判断调用者代表的时间是否在参数表示的时间的后面
boolean after = instant4.isAfter(instant5);
System.out.println(after); //false
//isBefore:判断调用者代表的时间是否在参数表示的时间前面
boolean before = instant4.isBefore(instant5);
System.out.println(before); //true
//减少时间系列的方法
//获取对象
Instant instant6 = Instant.ofEpochSecond(10l);
System.out.println(instant6); //1970-01-01T00:00:10Z
Instant instant7 = instant6.minusSeconds(1l);
System.out.println(instant7); //1970-01-01T00:00:09Z
//增加时间系列的方法
//获取对象
Instant instant8 = Instant.ofEpochSecond(10l);
System.out.println(instant8); //1970-01-01T00:00:10Z
Instant instant9 = instant6.plusSeconds(1l);
System.out.println(instant9); //1970-01-01T00:00:11Z
}
}
3. ZoneDateTime类
ZoneDateTime类是Java 8中的一个日期和时间类,它表示带有时区信息的日期和时间。
-
ZoneDateTime类是OffsetDateTime和ZonedDateTime的抽象类。它存储日期、时间和时区信息,并提供了一系列与日期和时间相关的方法。
-
ZoneDateTime类的实例可以使用静态工厂方法从特定的时区、地区、日期和时间构建。它还提供了获取日期、时间、时区、偏移量和UNIX时间戳的方法。
-
ZoneDateTime类还包含用于格式化和解析日期和时间字符串的方法。它可以将日期和时间转换为ISO-8601格式的字符串表示,也可以从ISO-8601格式的字符串解析出日期和时间。
3.1 方法
ZonedDateTime类:带时区的时间
静态方法 | 描述 |
---|---|
static ZonedDateTime now() |
获取当前时间的ZonedDateTime对象。 |
static ZonedDateTime ofXxxx(...) |
获取指定时间的ZonedDateTime对象,根据提供的参数来构建对象。 |
实例方法 | |
ZonedDateTime withXxx(时间) |
返回一个修改了特定时间字段的ZonedDateTime对象,例如修改年、月、日、时、分、秒等。 |
ZonedDateTime minusXxx(时间) |
返回一个减少了特定时间字段的ZonedDateTime对象,例如减少年、月、日、时、分、秒等。 |
ZonedDateTime plusXxx(时间) |
返回一个增加了特定时间字段的ZonedDateTime对象,例如增加年、月、日、时、分、秒等。 |
注意:上述"时间"指的是一定的时间量,可以是年、月、日、时、分、秒等。具体的时间量可根据具体方法而定,例如withYear(int year)
修改年份,minusHours(long hours)
减少小时数,plusMinutes(long minutes)
增加分钟数等。
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
3.2 代码示例
package text;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
/*
ZonedDateTime类:带时区的时间
static ZonedDateTime now() 获取当前时间的ZonedDateTime对象
static ZonedDateTime ofXxxx(。。。) 获取指定时间的ZonedDateTime对象
//以下方法不是静态方法,因此需要创建对象再使用
ZonedDateTime withXxx(时间) 修改时间系列的方法
ZonedDateTime minusXxx(时间) 减少时间系列的方法
ZonedDateTime plusXxx(时间) 增加时间系列的方法
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
*/
public class text91 {
public static void main(String[] args) {
//获取当前时间的ZonedDateTime对象(带时区)
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now); //2024-01-21T16:31:29.175+08:00[Asia/Shanghai]
//获取指定时间的ZonedDateTime对象
//方式一:年月日时分秒的方式指定
ZonedDateTime time1 = ZonedDateTime.of(2024, 06, 07, 12, 00, 59, 0, ZoneId.of("Asia/Shanghai"));
System.out.println(time1); //2024-06-07T12:00:59+08:00[Asia/Shanghai]
//方式二:通过Instant + 时区 的方式指定获取时间对象
//获取Instant对象
Instant instant = Instant.now();
//获取时区对象
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime time2 = ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(time2); //2024-01-21T16:37:51.888+08:00[Asia/Shanghai]
//修改时间系列的方法
System.out.println(time1); //2024-06-07T12:00:59+08:00[Asia/Shanghai]
ZonedDateTime time3 = time1.withYear(2030);
System.out.println(time3); //2030-06-07T12:00:59+08:00[Asia/Shanghai]
//减少时间系列的方法
System.out.println(time1); //2024-06-07T12:00:59+08:00[Asia/Shanghai]
ZonedDateTime time4 = time1.minusYears(1);
System.out.println(time4); //2023-06-07T12:00:59+08:00[Asia/Shanghai]
//增加时间系列的方法
System.out.println(time1); //2024-06-07T12:00:59+08:00[Asia/Shanghai]
ZonedDateTime time5 = time1.plusYears(1);
System.out.println(time5); //2025-06-07T12:00:59+08:00[Asia/Shanghai]
}
}
日期格式化类
1. DateTimeFormatter类
-
DateTimeFormatter类是Java 8中的一个日期和时间格式化类,它用于将日期和时间对象格式化为字符串,或将字符串解析为日期和时间对象。
-
DateTimeFormatter类提供了一系列预定义的格式化模式,用于指定日期和时间的输出格式。例如,可以使用"yyyy-MM-dd"指定年、月、日的格式,或使用"HH:mm:ss"指定小时、分钟、秒的格式。它还支持自定义的格式模式。
-
DateTimeFormatter类还提供了方法来设置和获取不同的字段,例如设置解析时所需的解析上下文,或获取格式化器的本地化信息。
-
DateTimeFormatter类的实例可以使用静态工厂方法创建,也可以使用ofPattern方法根据提供的模式字符串创建。它可以与日期和时间类一起使用,例如LocalDateTime、ZonedDateTime等。
1.1 方法
DateTimeFormatter类:用于时间的格式化和解析
静态方法 | 描述 |
---|---|
static DateTimeFormatter ofPattern(String pattern) |
获取具有指定格式的DateTimeFormatter对象。 |
实例方法 | |
String format(时间对象) |
将给定的时间对象按照DateTimeFormatter定义的格式进行格式化,并返回格式化后的字符串。 |
细节:JDK8新增的时间对象都是不可变的,如果我们修改了时间,那么调用者不会改变,而是产生一个新的时间
1.2 代码示例
package text;
import java.time.ZonedDateTim