LocalDateTime学习

TOC

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());




posted @ 2020-04-09 17:31  紫月java  阅读(801)  评论(0编辑  收藏  举报