Java 8 - 时间API

简介: Java 8 - 时间API

20200510181139786.png

Pre

并发编程-12线程安全策略之常见的线程不安全类


模拟SimpleDateFormate线程安全问题

package com.artisan.java8.testDate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2021/3/5 0:22
 * @mark: show me the code , change the world
 */
public class DateInJava8 {
    public static void main(String[] args) throws ParseException, InterruptedException {
        Date date = new Date();
        System.out.println(date);
        /**
         *  模拟SimpleDateFormat 的线程安全问题
         *
         *  Exception in thread "Thread-30" java.lang.NumberFormatException: multiple points
         *
         *  Exception in thread "Thread-24" java.lang.NumberFormatException: For input string: "E.250214E4"
         *
         */
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
        for (int i = 0; i < 100; i++) {
             new Thread(() -> {
                 for (int j = 0; j < 20; j++) {
                     try {
                         String format = sdf.format(date);
                         Date d = sdf.parse(format);
                         System.out.println(d);
                     } catch (ParseException e) {
                         e.printStackTrace();
                     }
                 }
             }).start();
        }
    }
}


20210305142048240.png


LocalDate

https://nowjava.com/docs/java-api-11/java.base/java/time/LocalDate.html

LocalDate 是final修饰的不可变类 并且是线程安全的.


20210305154327562.png


  • Java LocalDate is immutable class and hence thread safe.
  • LocalDate provides date output in the format of YYYY-MM-dd.

20210305154148356.png


The LocalDate class has no time or Timezone data. So LocalDate is suitable to represent dates such as Birthday, National Holiday etc.


LocalDate class implements Temporal, TemporalAdjuster, ChronoLocalDate and Serializable interfaces.


LocalDate is a final class, so we can’t extend it.


LocalDate is a value based class, so we should use equals() method for comparing if two LocalDate instances are equal or not.

 public static void testLocalDate(){
        LocalDate x = LocalDate.now(); // 日期  2021-03-05
        System.out.println(x);
        LocalDate lo = LocalDate.of(2021,3,5);
        System.out.println(lo.getYear()); // 年  2021
        System.out.println(lo.getMonth()); // 月 MARCH
        System.out.println(lo.getDayOfMonth()); // 日 5
        System.out.println(lo.getDayOfYear()); // 一年中的第几天
        System.out.println(lo.getDayOfMonth());// 一个月中的第几天
        System.out.println(lo.getDayOfWeek());// 礼拜几
        System.out.println(lo.get(ChronoField.DAY_OF_MONTH));
    }


LocalTime


LocalTime provides time without any time zone information. It is very much similar to observing the time from a wall clock which just shown the time and not the time zone information.


The assumption from this API is that all the calendar system uses the same way of representing the time.


It is a value-based class, so use of reference equality (==), identity hash code or synchronization on instances of LocalTime may have - unexpected results and is highly advised to be avoided. The equals method should be used for comparisons.


The LocalTime class is immutable that mean any operation on the object would result in a new instance of LocalTime reference.

private static void testLocalTime() {
        LocalTime time = LocalTime.now();
        System.out.println(time.getHour());
        System.out.println(time.getMinute());
        System.out.println(time.getSecond());
    }

LocalDateTime


Java LocalDateTime is an immutable class, so it’s thread safe and suitable to use in multithreaded environment.


LocalDateTime provides date and time output in the format of YYYY-MM-DD-hh-mm-ss.zzz, extendable to nanosecond precision. So we can store “2017-11-10 21:30:45.123456789” in LocalDateTime object.


20210305163855328.png

Just like the LocalDate class, LocalDateTime has no time zone data. We can use LocalDateTime instance for general purpose date and time information.


LocalDateTime class implements Comparable, ChronoLocalDateTime, Temporal, TemporalAdjuster, TermporalAccessor and Serializable interfaces.


LocalDateTime is a final class, so we can’t extend it.


LocalDateTime is a value based class, so we should use equals() method to check if two instances of LocalDateTime are equal or not.


LocalDateTime class is a synergistic ‘combination’ of LocalDate and LocalTime with the contatenated format as shown in the figure above.

    private static void testLocalDateTime() {
        LocalDate localDate = LocalDate.now();
        LocalTime time = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.of(localDate, time);
        System.out.println(localDateTime.toString());
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);
    }

Instant

    private static void testInstant() throws InterruptedException {
        Instant start = Instant.now();
        Thread.sleep(1000L);
        Instant end = Instant.now();
        Duration duration = Duration.between(start, end);
        System.out.println(duration.toMillis());
    }


Period

    private static void testPeriod() {
        Period period = Period.between(LocalDate.of(2020, 5, 10),LocalDate.of(2021, 3, 4));
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }


Duration

   private static void testDuration() {
        LocalTime time = LocalTime.now();
        System.out.println(time);
        LocalTime beforeTime = time.minusHours(2);
        System.out.println(beforeTime);
        Duration duration = Duration.between(beforeTime,time );
        System.out.println(duration.toHours());
    }


format

    private static void testDateFormat() {
        LocalDate localDate = LocalDate.now();
        String format1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(format1);
        DateTimeFormatter mySelfFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String format = localDate.format(mySelfFormatter);
        System.out.println(format);
    }


parse

  private static void testDateParse() {
        String date1 = "20210305";
        LocalDate localDate = LocalDate.parse(date1, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(localDate);
        DateTimeFormatter mySelfFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String date2 = "2021-03-05";
        LocalDate localDate2 = LocalDate.parse(date2, mySelfFormatter);
        System.out.println(localDate2);
    }


相关文章
|
3月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
3月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
249 100
|
3月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
282 101
|
3月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
248 101
|
4月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
4月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
370 188
|
4月前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
283 92
|
5月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
399 80
|
5月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
295 83
|
3月前
|
安全 Java API
使用 Java 构建强大的 REST API 的四个基本技巧
本文结合探险领域案例,分享Java构建REST API的四大核心策略:统一资源命名、版本控制与自动化文档、安全防护及标准化异常处理,助力开发者打造易用、可维护、安全可靠的稳健API服务。
212 2