概述
1、简介
LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。
注: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。
2、LocalDate、 LocalTime、 LocalDateTime常用方法:
方法 | 描述 | 示例 |
---|---|---|
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 | 判断是否是闰年 |
3、使用和示例
1. LocalDate、LocalTime、LocalDateTime
2. Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
3. Duration 和 Period
- Duration:用于计算两个“时间”间隔
- Period:用于计算两个“日期”间隔
4. 日期的操纵
- TemporalAdjuster : 时间校正器。有时我们可能需要获
取例如:将日期调整到“下个周日”等操作。 - TemporalAdjusters : 该类通过静态方法提供了大量的常
用 TemporalAdjuster 的实现。
5. DateTimeFormatter : 解析和格式化日期或时间
6. 时区的处理
- ZoneId:该类中包含了所有的时区信息
getAvailableZoneIds() : 可以获取所有时区时区信息。
of(id) : 用指定的时区信息获取 ZoneId 对象。 - ZonedDate、 ZonedTime、 ZonedDateTime
其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式。
例如 : Asia/Shanghai 等
示例:
/**
* 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]
/**
* LocalDateTime和字符串转换
*/
@Test
public void testFormatter() {
// LocalDateTime转字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(formatter.format(localDateTime));
// 字符串转LocalDateTime
String str = "2008-08-23 23:59:59";
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime2 = LocalDateTime.parse(str,formatter2);
System.out.println(localDateTime2);
}
/**
* Date和LocalDateTime转换
*/
@Test
public void testConver() {
// Date转LocalDateTime
Date date = new Date();
System.out.println(date);
LocalDateTime localDateTime = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
System.out.println(localDateTime);
// LocalDateTime转Date
Date lToDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println(lToDate);
}
最后
以上就是健壮画笔为你收集整理的4、java8新时间日期 API的全部内容,希望文章能够帮你解决4、java8新时间日期 API所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复