zoukankan      html  css  js  c++  java
  • 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());




  • 相关阅读:
    多测师肖老师_git版本控制器之使用(3.2.3)
    多测师肖老师_linux之yum源解决方法(2.3)
    快速排序c++实现
    算法复杂性表示
    lua学习测试脚本
    获取程序当前文件夹 c#
    C#读写注册表 二进制写入
    [转]c# Config修改
    C# 文件版本信息读取
    lua中的table
  • 原文地址:https://www.cnblogs.com/ziyue7575/p/f788aef533db655f4803b8541af3d4b6.html
Copyright © 2011-2022 走看看