www.zhblog.net

Java 8 中新的日期和时间API

说明

内容来自《Java 8 In Action》


LocalDate 和 LocalTime

LocalDate它只提供了简单的日期,并不含当天的时间信息。

// LocalDate date = LocalDate.of(2021, 5, 12);
LocalDate date = LocalDate.now();
int year = date.getYear();
int month = date.getMonthValue();
int day = date.getDayOfMonth();
int dayWeek = date.getDayOfWeek().getValue();
int len = date.lengthOfMonth();
boolean leap = date.isLeapYear();

int dm = date.get(ChronoField.DAY_OF_MONTH);

System.out.println("year=" + year);
System.out.println("month=" + month);
System.out.println("day=" + day);
System.out.println("dayWeek=" + dayWeek);
System.out.println("len=" + len);
System.out.println("leap=" + leap);

System.out.println("day_of_month=" + dm);


日期信息可以通过传递一个TemporalField参数给get方法拿到。TemporalField是一个接口,ChronoField枚举实现了这一接口。


一天中的时间,比如13:45:20,可以使用LocalTime类表示。

LocalTime time = LocalTime.now();
int hour = time.get(ChronoField.HOUR_OF_DAY);
int minute = time.getMinute();
int second = time.getSecond();
System.out.println("hour=" + hour);
System.out.println("minute=" + minute);
System.out.println("second=" + second);

System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second);
System.out.println(date + " " + time);


LocalDateLocalTime都有parse方法,可以解析代表它们的字符串。

private static void parse() {
    LocalDate date = LocalDate.parse("2021-05-12");
    System.out.println(date);
    LocalTime time = LocalTime.parse("16:00:10");
    System.out.println(time);
}


合并日期和时间:LocalDateTime

LocalDateTimeLocalDateLocalTime的合体,同时表示了日期和时间。

LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
dateTime.toLocalDate();
dateTime.toLocalTime();

dateTime = date.atTime(time);
System.out.println(dateTime);


机器时间

Instant它能够帮你获取当前时刻的时间戳。

private static void instant() {
    // 基本上它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的 秒数进行计算。
    System.out.println(Instant.now().toEpochMilli());
    System.out.println(new Date().getTime());
}


它们得到同样的值。


Duration

duration表示两个LocalTime之间的间隔。

private static void duration() {
    LocalTime t1 = LocalTime.now();
    LocalTime t2 = LocalTime.of(10, 30);
    Duration dt = Duration.between(t1, t2);
    System.out.println(dt.getSeconds());
}


LocalTime可以很轻易加减间隔,或者获取间隔的秒值等。


Period

Duration类似,Period表示日期之间的间隔。

private static void period() {
    Period pd = Period.of(2, 2, 2);
    LocalDate date = LocalDate.now();
    date = date.plus(pd);
    System.out.println("plus=" + date);
}


对日期进行编辑

private static void dateOptions() {
    LocalDate localDate = LocalDate.of(2014, 3, 18);
    localDate = localDate.with(ChronoField.MONTH_OF_YEAR, 9)
            .plus(2, ChronoUnit.YEARS)
            .minus(10, ChronoUnit.DAYS);
    System.out.println(localDate);
}


使用 TemporalAdjuster

目前所有日期操作都是相对比较直接的。有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象, 更加灵活地处理日期。

private static void adjuster() {
    LocalDate localDate = LocalDate.now();
    localDate = localDate.with(TemporalAdjusters.lastDayOfMonth());
    System.out.println(localDate);

    localDate = localDate.with(nextWorkingDayAdjuster());
    System.out.println(localDate);
}


获取下一个工作日的TemporalAdjuster实现

private static TemporalAdjuster nextWorkingDayAdjuster() {
    return temporal -> {
        DayOfWeek dayOfWeek = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        int inc = 1;
        if (dayOfWeek == DayOfWeek.FRIDAY) {
            inc = 3;
        } else if (dayOfWeek == DayOfWeek.SATURDAY) {
            inc = 2;
        }
        return temporal.plus(inc, ChronoUnit.DAYS);
    };
}


格式化时间

private static void format() {
    LocalDate localDate = LocalDate.now();
    String date = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
    System.out.println(date);

    LocalDateTime dateTime = LocalDateTime.now();
    String time = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
    System.out.println(time);

    time = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    System.out.println(time);

    LocalDateTime ldt = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    System.out.println(ldt);
}


如果你还需要更加细粒度的控制, DateTimeFormatterBuilder类还提供了更复杂的格式器,你可以构造自己的格式器。

private static void buildFormatter() {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendText(ChronoField.DAY_OF_WEEK)
            .appendLiteral(".")
            .appendText(ChronoField.DAY_OF_MONTH)
            .appendLiteral(".")
            .appendText(ChronoField.DAY_OF_YEAR)
            .toFormatter();
    String fmt = LocalDateTime.now().format(formatter);
    System.out.println(fmt);
}

  


  

展开阅读全文

评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 心情