• 【JAVA8新的时间与日期 API】- 本地时间、时间戳、日期时间的操纵、解析和格式化、时区、与传统日期的转换


    LocalDate、 LocalTime、 LocalDateTime

    LocalDate、 LocalTime、 LocalDateTime 类的实例是 不可变对象 ,分表表示使用 ISO-8601 日历系统的日期、时间、日期和时间。他们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

    注:ISO-8601 日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。说白了就是全球统一标准的表示方法。

     示例1:

    import org.junit.Test;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    import java.time.LocalTime;
    import java.time.Month;
    
    public class TestLocalDateTime {
        @Test
        public void test1(){
            LocalDate localDate = LocalDate.now();
            System.out.println(localDate);//输出:2020-06-25
            LocalTime localTime = LocalTime.now();
            System.out.println(localTime);//输出:23:12:59.211
            LocalDateTime localDateTime = LocalDateTime.now();
            System.out.println(localDateTime);//输出:2020-06-25T23:12:59.211
            System.out.println("-------------------------------------------");
            localDate = LocalDate.of(2022,1,1);
            System.out.println(localDate);//输出:2022-01-01
            localDate = LocalDate.of(2023, Month.AUGUST,2);
            System.out.println("-------------------------------------------");
            System.out.println(localDate);//输出:2023-08-02
            localTime = LocalTime.of(1,2);
            System.out.println(localTime);//输出:01:02
            localTime = LocalTime.of(1,2,3);
            System.out.println(localTime);//输出:01:02:03
            localTime = LocalTime.of(1,2,3,4);
            System.out.println(localTime);//输出:01:02:03.000000004
            System.out.println("-------------------------------------------");
            localDateTime = LocalDateTime.of(localDate,localTime);
            System.out.println(localDateTime);//输出:2023-08-02T01:02:03.000000004
            localDateTime = LocalDateTime.of(2024,1,1,1,1);
            System.out.println(localDateTime);//输出:2024-01-01T01:01
            localDateTime = LocalDateTime.of(2024,1,1,1,1,1);
            System.out.println(localDateTime);//输出:2024-01-01T01:01:01
            localDateTime = LocalDateTime.of(2024,1,1,1,1,1,1);
            System.out.println(localDateTime);//输出:2024-01-01T01:01:01.000000001
            localDateTime = LocalDateTime.of(2024,Month.of(2),1,1,1,1,1);
            System.out.println(localDateTime);//输出:2024-02-01T01:01:01.000000001
        }
    } 

    示例2:

     @Test
        public void test2(){
            LocalDate localDate = LocalDate.now();
            System.out.println(localDate);//输出:2020-06-30
            localDate = localDate.plusYears(1);
            System.out.println(localDate);//输出:2021-06-30
            localDate = localDate.plusMonths(2);
            System.out.println(localDate);//输出:2021-08-30
            localDate = localDate.plusDays(3);
            System.out.println(localDate);//输出:2021-09-02
            localDate = localDate.plusWeeks(4);
            System.out.println(localDate);//输出:2021-09-30
            localDate = localDate.plus(Period.ofDays(10));//加10天
            System.out.println(localDate);//输出:2021-10-10
            localDate = localDate.plus(Period.of(1,2,3));//加一年两个月三天
            System.out.println(localDate);//输出:2022-12-13
            localDate = localDate.plus(Period.ofYears(2));//加两年
            System.out.println(localDate);//输出:2024-12-13
            localDate = localDate.plus(1, ChronoUnit.DAYS);//加一天
            System.out.println(localDate);//输出:2024-12-14
            localDate = localDate.plus(1, ChronoUnit.MONTHS);//加一个月
            System.out.println(localDate);//输出:2025-01-14
            System.out.println("-------------------------------------------");
            localDate = localDate.minusYears(1);
            System.out.println(localDate);//输出:2024-01-14
            localDate.minusMonths(1);
            localDate.minusDays(1);
            localDate.minusWeeks(1);
            localDate.minus(Period.ofYears(2));
            //..........其他用法和plus一样...........
            System.out.println("-------------------------------------------");
    
            LocalTime localTime = LocalTime.now();
            System.out.println(localTime);//输出:21:35:54.776
            localTime = localTime.plusHours(1);
            System.out.println(localTime);//输出:22:35:54.776
            //..........其他用法和localDate的一样...........
            //..........LocalDateTime的用法也一样...........
        }

    示例3:

        @Test
        public void test3(){
            LocalDate localDate = LocalDate.now();
            System.out.println(localDate);//输出:2020-06-30
            System.out.println(localDate.getYear());//输出:2020
            System.out.println(localDate.getDayOfMonth());//输出:30
            //..........等.......
    
            //将天数、月份、等修改为指定的值
            localDate = localDate.withDayOfMonth(22);
            System.out.println(localDate);//输出:2020-06-22
            localDate = localDate.withMonth(11);
            System.out.println(localDate);//输出:2020-11-22
            localDate = localDate.with(LocalDate.now());
            System.out.println(localDate);//输出:2020-06-30
            //..........等.......
            System.out.println("-------------------------------------------");
    
            Period period = localDate.until(LocalDate.of(2020, 1, 1));
            System.out.println(period.get(ChronoUnit.YEARS));//输出:0  相差 0 年
            System.out.println(period.get(ChronoUnit.MONTHS));//输出:-5  相差 1 - 6 = -5 月
            System.out.println(period.get(ChronoUnit.DAYS));//输出:-29  相差 1 - 30 = -29 天
            System.out.println("-------------------------------------------");
    
            System.out.println(localDate.isAfter(LocalDate.of(2020, 1, 1))); //输出:true
            System.out.println(localDate.isBefore(LocalDate.of(2020, 1, 1))); //输出:false
            System.out.println(localDate.isLeapYear());//是否闰年,输出:true
        }

    Instant 时间戳

     时间戳,以 Unix 元年:1970年1月1日00:00:00 到某个时间之间的毫秒值 。

    示例:

        @Test
        public void test4() {
            Instant ins1 = Instant.now();    // 默认获取UTC时区(世界协调时间,基本上是美国鬼子使用,和中国时间相差大概8小时)
            System.out.println(ins1);//输出结果:2020-06-30T14:28:05.217Z
    
            // 偏移量运算
            OffsetDateTime offsetDateTime = ins1.atOffset(ZoneOffset.ofHours(8));
            System.out.println(offsetDateTime);// 输出结果:2020-06-30T22:28:05.217+08:00    当前系统时间,国际标准的显示时间方式
    
            // 获取时间戳
            System.out.println(ins1.toEpochMilli());//输出结果:1593527285217
    
            // 以Unix元年为起点,进行偏移量运算
            Instant ins2 = Instant.ofEpochSecond(60);
            System.out.println(ins2);// 运行结果:1970-01-01T00:01:00Z
        }

    Duration 和 Period 类

    Duration : 计算两个 “时间” 之间的间隔。

    Period:计算两个“日期” 之间的间隔。

    示例:

        @Test
        public void test5() throws Exception {
            Instant ins1 = Instant.now();
            Thread.sleep(1000);
            Instant ins2 = Instant.now();
    
            Duration duration = Duration.between(ins1, ins2);
            System.out.println(duration.toMillis()); // 运行结果:1000
    
            LocalTime localTime_1 = LocalTime.of(20,1,2);
            LocalTime localTime_2 = LocalTime.of(20,2,2);
    
            System.out.println(Duration.between(localTime_1, localTime_2).toMillis());// 运行结果:60000
    
            System.out.println("-------------------------------------------");
    
            LocalDate localDate_1 = LocalDate.of(2020,1, 1);
            LocalDate localDate_2 = LocalDate.now();
    
            Period period = Period.between(localDate_1, localDate_2);
            System.out.println(period.getYears());      // 运行结果:0
            System.out.println(period.getMonths());     // 运行结果:5
            System.out.println(period.getDays());       // 运行结果:29
        }

    日期的操纵

    TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
    TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现

    示例:

        @Test
        public void test6(){
    
            //TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
            //TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。
            LocalDate localDate = LocalDate.now();
            System.out.println(localDate);// 输出:2020-07-01
            localDate = localDate.with(TemporalAdjusters.lastDayOfMonth());
            System.out.println(localDate);// 输出:2020-07-31
            localDate = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
            System.out.println(localDate);// 输出:2020-08-02
    
            localDate = LocalDate.of(2020,7,3);//周五
            //自定义校正器:获取下一个工作日
            localDate = localDate.with(ld -> {
                LocalDate ld_ = (LocalDate) ld;
                DayOfWeek dayOfWeek =  ld_.getDayOfWeek();
    
                if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
                    return ld_.plusDays(3);
                } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
                    return ld_.plusDays(2);
                } else {
                    return ld_.plusDays(1);
                }
            });
            System.out.println(localDate);// 输出:2020-07-06
    
        }

    解析与格式化

    java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:

    • 预定义的标准格式
    • 语言环境相关的格式
    • 自定义的格式

    示例:

        @Test
        public void test7(){
            // DateTimeFormatter 格式化 时间/日期
            LocalDateTime localDateTime = LocalDateTime.now();
            System.out.println(localDateTime);// 输出: 2020-07-01T21:56:11.978
            DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
            System.out.println(formatter.format(localDateTime));// 输出: 2020-07-01
            formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
            System.out.println(formatter.format(localDateTime));// 输出: 2020年07月01日 21时56分11秒
            System.out.println(formatter.parse("2020年07月01日 21时55分08秒"));// 输出: {},ISO resolved to 2020-07-01T21:55:08
    
            System.out.println(localDateTime.parse("2020年07月01日 21时55分08秒",formatter));// 输出: 2020-07-01T21:55:08
    
        }

    时区的处理

    Java8 中加入了对时区的支持,带时区的时间为分别为:ZonedDate、 ZonedTime、 ZonedDateTime
    其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式,例如 : Asia/Shanghai 等。

    • ZoneId:该类中包含了所有的时区信息
    • getAvailableZoneIds() : 可以获取所有时区时区信息
    • of(id) : 用指定的时区信息获取 ZoneId 对象

    示例:

        @Test
        public void test8(){
            //时区:ZonedDate、 ZonedTime、 ZonedDateTime
    
            Set<String> zoneIds = ZoneId.getAvailableZoneIds();//获取所有时区
            System.out.println(zoneIds);//输出: [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, .....等等.....
            LocalDateTime localDateTime = LocalDateTime.now();
            System.out.println(localDateTime);// 输出: 2020-07-01T22:06:59.130
            localDateTime = LocalDateTime.now(ZoneId.of("America/Marigot"));
            System.out.println(localDateTime);// 输出: 2020-07-01T10:06:59.131
            localDateTime = LocalDateTime.now(ZoneId.of("Etc/GMT+8"));
            System.out.println(localDateTime);// 输出: 2020-07-01T06:06:59.131
            System.out.println("-------------------------------------------");
            localDateTime = LocalDateTime.now();
            System.out.println(localDateTime);// 输出: 2020-07-01T22:10:39.940
            ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Europe/Vatican"));//带时区的日期时间
            System.out.println(zonedDateTime);// 输出: 2020-07-01T22:10:39.940+02:00[Europe/Vatican]
    
        }

  • 相关阅读:
    mysql dbrd脑裂问题
    iOS 跳转至AppStore评分页面
    UIButton的titleLabe setAttributeSting 首次不起作用
    IOS ScrollView放大缩小点击位置并居中
    UIScrollView 性能优化
    iOS UIButton单双击处理响应不同的方法
    正则表达式过滤手机号
    iOS8通讯录之联系人增删查,多号码增删操作
    CoreData 添加新字段
    一张图教你搞定Mac App Store 应用安装包存储路径
  • 原文地址:https://www.cnblogs.com/y3blogs/p/13193426.html
Copyright © 2020-2023  润新知