欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java8之新时间日期API

程序员文章站 2022-05-05 08:56:03
...

1.LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
2.Instant时间戳
3.Duration和Period
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
4.日期的操纵
TemporalAdjuster:时间校正器,比如将时间调整到“下个周日”
TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现
5.解析与格式化
Java.time.format.DateTimeFormatter类——该类提供了三种格式化方法
预定义的标准格式
语言环境相关的格式
自定义的格式
6.时区的处理
Java8中加入了对时区的支持,带时区的时间分别为:ZonedDate、ZonedTime、ZonedDateTime,其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式。
ZoneId:该类中包含了所有的时区信息
getAvailableZoneIds():可以获取所有时区信息
of(id):用指定的时区信息获取ZoneId对象

package com.alisa.java8.time;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Set;

@RunWith(SpringRunner.class)
@SpringBootTest
public class LocalDateTimeTest {
    //1、LocalDate、LocalTime、LocalDateTime
    @Test
    public void test1(){
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);

        LocalDateTime ldt2 = LocalDateTime.of(2019,8,18,21,49,40);
        System.out.println(ldt2);

        LocalDateTime ldt3 = ldt2.plusYears(2);
        System.out.println(ldt3);

        LocalDateTime ldt4 = ldt2.minusMonths(2);
        System.out.println(ldt4);

        System.out.println(ldt1.getYear());
        System.out.println(ldt1.getMonthValue());
        System.out.println(ldt1.getDayOfMonth());
        System.out.println(ldt1.getHour());
        System.out.println(ldt1.getMinute());
        System.out.println(ldt1.getSecond());
    }

    //2、Instant:时间戳
    @Test
    public void test2(){
        Instant ins1 = Instant.now();
        System.out.println(ins1.toEpochMilli());

        OffsetDateTime odt = ins1.atOffset(ZoneOffset.ofHours(8));
        System.out.println(odt);

        Instant ins2 = Instant.ofEpochSecond(5);
        System.out.println(ins2);
    }

    //3、Duration:用于计算两个“时间”间隔
    //   Period:用于计算两个“日期”间隔
    @Test
    public void test3(){
        Instant ins1 = Instant.now();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
        }
        Instant ins2 = Instant.now();
        System.out.println("耗费时间为:"+ Duration.between(ins1,ins2));
        System.out.println("============================");
        LocalDate ld1 = LocalDate.now();
        LocalDate ld2 = LocalDate.of(2018,8,18);
        Period pe = Period.between(ld2,ld1);
        System.out.println(pe.getYears());
        System.out.println(pe.getMonths());
        System.out.println(pe.getDays());
    }

    //4、TemporalAdjuster:时间校正器
    @Test
    public void test4(){
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);

        LocalDateTime ldt2 = ldt1.withDayOfMonth(10);
        System.out.println(ldt2);

        LocalDateTime ldt3 = ldt1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
        System.out.println(ldt3);

        //自定义下一个工作日
        LocalDateTime ldt4 = ldt1.with((time) -> {
            LocalDateTime ldt5 = (LocalDateTime) time;
            DayOfWeek dow = ldt5.getDayOfWeek();
            if(dow.equals(DayOfWeek.FRIDAY)){
                return ldt5.plusDays(3);
            }else if(dow.equals(DayOfWeek.SATURDAY)){
                return ldt5.plusDays(2);
            }else{
                return ldt5.plusDays(1);
            }
        });
        System.out.println(ldt4);
    }

    //5、DateTimeFormatter:解析和格式化日期或时间
    @Test
    public void test5(){
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1.format(dtf1));
    }

    //6、ZonedDate、ZonedTime、ZonedDateTime:带时区的时间或日期
    @Test
    public void test6(){
        //获取所有时区
        Set<String> set = ZoneId.getAvailableZoneIds();
        //set.forEach(System.out::println);

        LocalDateTime ldt1 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
        System.out.println(ldt1);
        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
        System.out.println(zdt);
    }
}

相关标签: Java8 java8