LocalDate、 LocalTime、 LocalDateTime 类的实
例是不可变的对象,分别表示使用 ISO-8601日
历系统的日期、时间、日期和时间。它们提供
了简单的日期或时间,并不包含当前的时间信
息。也不包含与时区相关的信息。
注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。
方法 | 描述 | 示例 |
---|---|---|
now() | 静态方法,根据当前时间创建对象 | LocalDateTime localDateTime = LocalDateTime.now(); |
of() | 静态方法,根据指定日期/时间创建对象 | LocalDateTime localDateTime = LocalDateTime.of(2018, 10,26, 12, 10, 55); |
plusDays, plusWeeks,plusMonths, plusYears | 向当前 LocalDate 对象添加几天、几周、 几个月、 几年 | |
minusDays, minusWeeks,minusMonths, minusYears | 从当前 LocalDate 对象减去几天、几周、 几个月、 几年 | |
plus, minus | 添加或减少一个 Duration 或 Period | |
withDayOfMonth,withDayOfYear,withMonth,withYear | 将月份天数、 年份天数、 月份、 年份 修 改 为 指 定 的 值 并 返 回 新 的LocalDate 对象 | |
getDayOfMonth | 获得月份天数(1-31) | |
getDayOfYear | 获得年份天数(1-366) | |
getDayOfWeek | 获得星期几(返回一个 DayOfWeek枚举值) | |
getMonth | 获得月份, 返回一个 Month 枚举值 | |
getMonthValue | 获得月份(1-12) | |
getYear | 获得年份 | |
until | 获得两个日期之间的 Period 对象,或者指定 ChronoUnits 的数字 | |
isBefore, isAfter | 比较两个 LocalDate | |
isLeapYear | 判断是否是闰年 |
1. LocalDate、LocalTime、LocalDateTime
2. Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
3. Duration 和 Period
4. 日期的操纵
5. DateTimeFormatter : 解析和格式化日期或时间
6. 时区的处理
/**
* 1、LocalDate、LocalTime、LocalDateTime
*/
@Test
public void test01(){
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt2 = LocalDateTime.of(2018, 12, 22, 10, 10, 10);
System.out.println(ldt2);
// 加二十年
LocalDateTime ldt3 = ldt2.plusYears(20);
System.out.println(ldt3);
// 减两个月
LocalDateTime ldt4 = ldt2.minusMonths(2);
System.out.println(ldt4);
}
输出结果:
2019-01-05T10:35:31.597
2018-12-22T10:10:10
2038-12-22T10:10:10
2018-10-22T10:10:10
/**
* 2、Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
*/
@Test
public void test02(){
Instant ins = Instant.now();
System.out.println(ins); //默认使用 UTC 时区
OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8)); // 转成中国时区
System.out.println(odt);
System.out.println(ins.toEpochMilli()); // 毫秒时间戳
}
输出结果:
2019-01-05T02:43:22.004Z
2019-01-05T10:43:22.004+08:00
1546656202004
/**
* 3、Duration : 用于计算两个“时间”间隔
* Period : 用于计算两个“日期”间隔
*/
@Test
public void test3(){
Instant ins1 = Instant.now();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
Instant ins2 = Instant.now();
System.out.println("所耗费时间为:" + Duration.between(ins1, ins2));
System.out.println("----------------------------------");
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.of(2011, 1, 1);
Period pe = Period.between(ld2, ld1);
System.out.println(pe.getYears());
System.out.println(pe.getMonths());
System.out.println(pe.getDays());
}
输出结果:
所耗费时间为:PT1.001S
----------------------------------
8
0
4
/**
* 4、TemporalAdjuster : 时间校正器
*/
@Test
public void test04(){
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt2 = ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println(ldt2);
//自定义:下一个工作日
LocalDateTime ldt4 = ldt.with((l) -> {
LocalDateTime ldt3 = (LocalDateTime) l;
DayOfWeek dow = ldt3.getDayOfWeek();
if(dow.equals(DayOfWeek.FRIDAY)){
return ldt3.plusDays(3);
}else if(dow.equals(DayOfWeek.SATURDAY)){
return ldt3.plusDays(2);
}else{
return ldt3.plusDays(1);
}
});
System.out.println(ldt4);
}
输出结果:
2019-01-05T11:14:23.353
2019-01-11T11:14:23.353
2019-01-07T11:14:23.353
/**
* 5、DateTimeFormatter : 解析和格式化日期或时间
*/
@Test
public void test05(){
DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dft);
System.out.println(strDate);
LocalDateTime newLdt = parse(strDate, dft);
System.out.println(newLdt);
}
输出结果:
2019年01月05日 11:29:06 星期六
2019-01-05T11:29:06
/**
* 6、ZonedDate、ZonedTime、ZonedDateTime : 带时区的时间或日期
*/
@Test
public void test06(){
Set<String> set = ZoneId.getAvailableZoneIds(); // 获取所有时区
// set.forEach(System.out::println);
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
System.out.println(zdt);
}
输出结果:
2019-01-05T11:35:52.179
2019-01-04T19:35:52.181-08:00[US/Pacific]