LocalDateTime学习
LocalDate(年月日)
获取今天的日期
获取年、月、日信息
设置年月日of
判断两个日期是否相等:equals
检查像生日这种周期性事件(月和日)
计算一周后的日期
计算一年前或一年后的日期
判断日期是早于还是晚于另一个日期
检查闰年
LocalTime (时分秒)
获取当前时间
时间加减计算
Clock时钟类
ZoneDateTime 处理时区
本时区的时间转换成另一个时区的时间
YearMonth 年月
获取当前年月
获取当月天数
Period
计算两个日期之间的天数和月数
Duration
计算两个时间之间差值
Instant时间戳
获取当前的时间戳
转换
使用预定义的格式化工具去解析或格式化日期
字符串互转日期类型
Date类和Instant类转换
Date转LocalDateTime
ms转LocalDateTime
LocalDateTime 转 ms
LocalDate转Date
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());