LocalDate、LocalTime、LocalDateTime等详解


参考https://blog.csdn.net/p812438109/article/details/83652695,为了方便自己查看,自己用idea敲了一遍。

LocalDate

//获取年份
int year = LocalDate.now().getYear();
//获取月份
int monthValue = LocalDate.now().getMonthValue();
// 获取当前年份的第几天
int dayOfYear = LocalDate.now().getDayOfYear();
// 获取月份的第几天
int dayOfMonth = LocalDate.now().getDayOfMonth();
System.out.println(year+" - "+monthValue+" - " + dayOfMonth);//2020-1-4

//指定某一年的第几天
LocalDate localDate = LocalDate.ofYearDay(2020, 366);//如果大于当年的最大时间,则报错
System.out.println(localDate); // 2020-12-31
// 过期某一天
LocalDate localDate1 = LocalDate.now().minusDays(2);
System.out.println(localDate1); // 2020-01-02

//指定当月的第几天
LocalDate localDate2 = LocalDate.now().withDayOfMonth(23);
System.out.println(localDate2); // 2020-01-23

//从1970-01-01开始计算,加上指定的天数
LocalDate localDate3 = LocalDate.ofEpochDay(0);
System.out.println(localDate3); // 1970-01-01

// 当前年份的总天数
int lengthOfYear = LocalDate.now().lengthOfYear();// 366

//当前年月日(默认格式)
LocalDate now = LocalDate.now();
System.out.println(now);//2020-01-04

//当前年月日(指定年份)
LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

//将指定的年月日转换成LocalDate模式
LocalDate parse = LocalDate.parse("2019-12-12");
//将指定的年月日转换成LocalDate模式, 格式要对应
LocalDate parse1 = LocalDate.parse("2019-12-12", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(parse1);

//检查当前年份是否是闰年
boolean leapYear = LocalDate.now().isLeapYear();
System.out.println(leapYear);

LocalTime

很少用到只返回小时的。
@Test
public void test2(){
     //返回 hh:mm:ss
     LocalTime now = LocalTime.now();
     System.out.println(now);
     LocalTime of = LocalTime.of(12, 59, 59, 999999999);
     System.out.println(of);
     LocalTime parse = LocalTime.parse("23:12:59");
     System.out.println(parse);

    }

LocalDateTime

@Test
public void test3(){
//LocalDateTime api和LocalDate 基本差不多,所以少位居一些例子

//获取当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 2020-01-04T21:37:03.340

String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(format);//2020-01-04 21:37:03

LocalDateTime parse = LocalDateTime.parse("2019-11-01T00:00:00");
System.out.println(parse);//2019-11-01T00:00

//指定时间转换成指定格式
LocalDateTime parse1 = LocalDateTime.parse("2019-11-01 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(parse1); // 2019-11-01T23:59:59

}

SimpleDateFormat 格式化引起的问题

SImpleDateFormat 是线程不安全的,所以需要用ThreadLocal 去加锁。

@Test
public void testSimpleDateFormat() throws ExecutionException, InterruptedException {

  Callable<Date> task = new Callable<Date>() {
        @Override
        public Date call() throws Exception {
            return SimpleDateLocalThread.convert("20191212");
        }
    };

    ExecutorService pool = Executors.newFixedThreadPool(10);
    List<Future<Date>> result = new ArrayList<>();
    for (int i = 0 ; i < 10 ; i++){
        result.add(pool.submit(task));
    }

    for (Future<Date> future : result){
        System.out.println(future.get());
    }

    pool.shutdown();
}


class SimpleDateLocalThread{

    private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){

        @Override
        protected DateFormat initialValue(){
            return new SimpleDateFormat("yyyyMMdd");
        }
    };

    public static Date convert(String source) throws ParseException {
        return df.get().parse(source);
    }
}

使用 LocalDate 来实现多线程安全

@Test
public void testDateTimeFormat2() throws ExecutionException, InterruptedException {

    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");

    Callable<LocalDate> task = new Callable<LocalDate>() {
        @Override
        public LocalDate call() throws Exception {
            return LocalDate.parse("20191212",df);
        }
    };

    ExecutorService pool = Executors.newFixedThreadPool(10);
    List<Future<LocalDate>> result = new ArrayList<>();
    for (int i = 0 ; i < 10 ; i++){
        result.add(pool.submit(task));
    }

    for (Future<LocalDate> future : result){
        System.out.println(future.get());
    }

    pool.shutdown();
}

Instant 时间戳

 @Test
public void testInstant(){

     // Instant:时间戳(以Unix 元年,以1970年1月1日...开始)
     Instant now = Instant.now();
     System.out.println(now); // 2020-01-08T14:25:45.854Z

     // 偏移量
     OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
     System.out.println(offsetDateTime.toEpochSecond()); // 1578493545

 }

Duration 、Period

都表示时间差

@Test
public void testDuration() throws InterruptedException {
    Instant now = Instant.now();
    Thread.sleep(1);
    Instant now2 = Instant.now();
    Duration between = Duration.between(now, now2);
    System.out.println(between.getNano()); // 6000000
}
@Test
public void testPeriod(){
        LocalDate startTime = LocalDate.of(2015, 12, 12);
        LocalDate endTime = LocalDate.of(2015, 12, 12);

        Period between = Period.between(startTime, endTime);
        System.out.println(between.getMonths());//0

        boolean negative = between.isNegative();// 比较两个时间
        System.out.println(negative);
}

TemporalAdjuster 时间矫正器

@Test
public void testTemPoralAdjuster(){

    LocalDateTime now = LocalDateTime.now();
    now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); // 下周五

    // 自定义
    LocalDateTime with = now.with(l -> {
        LocalDateTime t = (LocalDateTime) l;
        Month month = t.getMonth();
        if (month.getValue() == 1) {
            return t.plusDays(1);
        } else {
            return t.plusDays(2);
        }
    });

    System.out.println(with);
}

或者写成构造方法

@Test
public void test7(){
    testTemporal(LocalDateTime.now());
}

//写成方法
public static void testTemporal(Temporal temporal){

    LocalDateTime temporal1 = (LocalDateTime) temporal;
    // 自定义
    LocalDateTime with = temporal1.with(l -> {
        LocalDateTime t = (LocalDateTime) l;
        Month month = t.getMonth();
        if (month.getValue() == 1) {
            return t.plusDays(1);
        } else {
            return t.plusDays(2);
        }
    });

}
发布了46 篇原创文章 · 获赞 6 · 访问量 2652

猜你喜欢

转载自blog.csdn.net/renguiriyue/article/details/103836640
今日推荐