LocalDateTime学习
LocalDateTime学习
参考:https://mp.weixin.qq.com/s/peUTmR0wuXqHzY3zbxYLxg
Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。
新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
类的名称 | 描述 |
---|---|
Instant | 时间戳 |
Duration | 持续时间,时间差 |
LocalDate | 只包含日期,比如:2018-02-05 |
LocalTime | 只包含时间,比如:23:12:10 |
LocalDateTime | 包含日期和时间,比如:2018-02-05 23:14:21 默认 2020-03-10T11:52:30.227 格式 |
Period | 时间段 |
ZoneOffset | 时区偏移量,比如:+8:00 |
ZonedDateTime | 带时区的时间 |
Clock | 时钟,比如获取目前美国纽约的时间 |
java.time.format.DateTimeFormatter | 时间格式化 |
LocalDate(年月日)
默认情况下请求的 yyyy-MM-dd 字符串可以自动转为这个格式
获取今天的日期
Java 8 中的 LocalDate 用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。当你仅需要表示日期时就用这个类。
LocalDate today = LocalDate.now();
System.out.println("今天的日期:"+today);
获取年、月、日信息
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.println("year:"+year);
System.out.println("month:"+month);
System.out.println("day:"+day);
设置年月日of
LocalDate date = LocalDate.of(2018,2,6);
System.out.println("自定义日期:"+date);
判断两个日期是否相等:equals
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2018,2,5);
if(date1.equals(date2)){
System.out.println("时间相等");
}else{
System.out.println("时间不等");
}
检查像生日这种周期性事件(月和日)
只要当天的日期和生日匹配,无论是哪一年都会打印出祝贺信息。你可以把程序整合进系统时钟,看看生日时是否会受到提醒,或者写一个单元测试来检测代码是否运行正确。
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2018,2,6);
MonthDay birthday = MonthDay.of(date2.getMonth(),date2.getDayOfMonth());
MonthDay currentMonthDay = MonthDay.from(date1);
if(currentMonthDay.equals(birthday)){
System.out.println("是你的生日");
}else{
System.out.println("你的生日还没有到");
}
计算一周后的日期
LocalDate today = LocalDate.now();
System.out.println("今天的日期为:"+today);
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("一周后的日期为:"+nextWeek);
计算一年前或一年后的日期
LocalDate today = LocalDate.now();
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
System.out.println("一年前的日期 : " + previousYear);
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("一年后的日期:"+nextYear);
判断日期是早于还是晚于另一个日期
在Java 8中,LocalDate类有两类方法
isBefore()
和isAfter()
用于比较日期。调用isBefore()方法时,如果给定日期小于当前日期则返回true。
LocalDate today = LocalDate.now();
LocalDate tomorrow = LocalDate.of(2018,2,6);
if(tomorrow.isAfter(today)){
System.out.println("之后的日期:"+tomorrow);
}
LocalDate yesterday = today.minus(1, ChronoUnit.DAYS);
if(yesterday.isBefore(today)){
System.out.println("之前的日期:"+yesterday);
}
检查闰年
LocalDate today = LocalDate.now();
if(today.isLeapYear()){//是闰年
System.out.println("This year is Leap year");
}else {
System.out.println("2018 is not a Leap year");
}
LocalTime (时分秒)
获取当前时间
LocalTime time = LocalTime.now();
System.out.println("获取当前的时间,不含有日期:"+time);
可以看到当前时间就只包含时间信息,没有日期
时间加减计算
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(3);
System.out.println("三个小时后的时间为:"+newTime);
Clock时钟类
Java 8增加了一个Clock时钟类用于获取当时的时间戳,或当前时区下的日期时间信息。以前用到System.currentTimeInMillis()和TimeZone.getDefault()的地方都可用Clock替换。
获取当前ms
Clock clock = Clock.systemUTC();
System.out.println("Clock : " + clock.millis());
Clock defaultClock = Clock.systemDefaultZone();
System.out.println("Clock : " + defaultClock.millis());
ZoneDateTime 处理时区
ZoneDateTime类来表示某时区下的时间。
本时区的时间转换成另一个时区的时间
ZoneId america = ZoneId.of("America/New_York");
LocalDateTime localtDateAndTime = LocalDateTime.now();
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america );
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork);
YearMonth 年月
获取当前年月
YearMonth currentYearMonth = YearMonth.now();
获取当月天数
YearMonth currentYearMonth = YearMonth.now();
currentYearMonth.lengthOfMonth()
Period
计算两个日期之间的天数和月数
注意:5.3-5.1相减是2天,5.10-4.1相减是1月9天,获取天的时候是
LocalDate today = LocalDate.now();
LocalDate java8Release = LocalDate.of(2018, 12, 14);
Period periodToNextJavaRelease = Period.between(today, java8Release);
注意:超过一个月天数就不准了
getMonths()和getDays()的值
5.10/5.1: 1,9
5.10/4.1:1,9 (月份和天数相加才是真正相差的数)
6.10/4.1:2,9 (月份和天数相加才是真正相差的数)
Duration
计算两个时间之间差值
LocalDateTime相加减
Duration duration = Duration.between(now,end);
Instant时间戳
时间戳信息里同时包含了日期和时间,这和java.util.Date很像。实际上Instant类确实等同于 Java 8之前的Date类,你可以使用Date类和Instant类各自的转换方法互相转换
获取当前的时间戳
Instant类有一个静态工厂方法now()会返回当前的时间戳
Instant timestamp = Instant.now();
System.out.println("What is value of this instant " + timestamp.toEpochMilli());
转换
使用预定义的格式化工具去解析或格式化日期
String dayAfterTommorrow = "20180205";
LocalDate formatted = LocalDate.parse(dayAfterTommorrow,
DateTimeFormatter.BASIC_ISO_DATE);//转换的格式
System.out.println(dayAfterTommorrow+" 格式化后的日期为: "+formatted);
字符串互转日期类型
LocalDateTime date = LocalDateTime.now();
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String str = date.format(format1);
System.out.println("日期转换为字符串:"+str);
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDate date2 = LocalDate.parse(str,format2);
System.out.println("日期类型:"+date2);
Date类和Instant类转换
Instant转换成Date: Date.from(Instant)
Date转换成Instant: Date.toInstant()
Date转LocalDateTime
time=workDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()
ms转LocalDateTime
LocalDateTime.ofInstant(Instant.ofEpochMilli(1213113213123), ZoneId.systemDefault());
LocalDateTime 转 ms
LocalDateTime.of(2020, 3, 1,0,0,0).toInstant(ZoneOffset.of("+8")).toEpochMilli()
LocalDate转Date
Date.from( localDate.atStartOfDay(ZoneId.systemDefault()) .toInstant());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示