Java 8 日期、时间、时间矫正器操作

Java 8 日期、时间操作

真放肆不在饮酒放荡,假矜持偏要慷慨激昂。万事留一线,江湖好相见–老郭经典语录

本篇描述LocalDate、LocalTime、LocalDateTime、TemporalAdjuster基本API的使用

一、概述

在Java8之前,日期时间API一直被开发者疯狂吐槽。
    槽点一:java.util.Date是可变类型
    槽点二:SimpleDateFormat非线程安全。。。
So 它来了Java8引入了一套全新的日期时间处理API,新的API基于ISO-8601标准日历系统。

LocalDate、LocalTime、LocalDateTime 类是不可变的对象,分别表示使用ISO-8601日期日历系统的日期、时间、日期和时间  
TemporalAdjuster 时间矫正器

注:ISO-8601日历系统是国际标准化组织指定的现代公民的日期和时间的表示法

二、初识 LocalDate

Java 8中的LocalDate 用于表示当天日期。和java.util.Date不同,它只有日期,不包含时间。

eg1: 获取当天日期

 public static void main(String[] args) {
     LocalDate date = LocalDate.now();
     System.out.println("当前日期=" + date); // 当前日期=2020-05-11
 }

eg2: 构造指定日期

调用工厂方法LocalDate.of()创建任意日期, 该方法需要传入年、月、日做参数,返回对应的LocalDate实例。

这个方法摒弃了以前API的头疼时间,比如年度起始于1900,月份是从0开始。。。

public static void main(String[] args) {
    LocalDate date = LocalDate.of(2000, 1, 1);
    System.out.println("LocalDate=" + date); // LocalDate=2000-01-01
}

eg3: 获取年月日信息

public static void main(String[] args) {
   LocalDate date = LocalDate.now();
   System.out.printf("%d年,%d月,%d日", date.getYear(),
    date.getMonthValue(), date.getDayOfMonth()); // 2020年,5月,11日
}

eg4: 比较两个日期是否相等

public static void main(String[] args) {
    LocalDate now = LocalDate.now();
    LocalDate date = LocalDate.of(2018, 9, 24);
    System.out.println("日期是否相等=" + now.equals(date));
}

三、初识-LocalTime

Java 8中的 LocalTime 用于表示当天时间。和java.util.Date不同,它只有时间,不包含日期。

eg1: 获取当前时间

public static void main(String[] args) {
    LocalTime time = LocalTime.now();
    System.out.println("当前时间=" + time); // 当前时间=00:17:19.648
    System.out.printf("%d时,%d分,%d秒", time.getHour(),time.getMinute() ,time.getSecond());// 0时,19分,38秒
}

四、比较与计算

Java 8提供了新的plusXxx()方法用于计算日期时间增量值,替代了原来的add()方法。新的API将返回一个全新的日期时间示例,需要使用新的对象进行接收。

eg1: 日期时间计算

public static void main(String[] args) {
    // 时间增量
    LocalTime time = LocalTime.now();
    LocalTime newTime = time.plusHours(2);  // 当前时间往前推2个小时
    System.out.println("newTime=" + newTime); 
    // 日期增量
    LocalDate date = LocalDate.now();
    LocalDate newDate = date.plus(1, ChronoUnit.WEEKS); // 当前日期往前推一周
    System.out.println("newDate=" + newDate);
}

Java 8 提供了isAfter()isBefore()用于判断当前日期时间和指定日期时间的比较

eg2: 日期时间比较

public static void main(String[] args) {

    LocalDate now = LocalDate.now();
    
    LocalDate dateOld = LocalDate.of(2000, 1, 1);
    if (now.isAfter(dateOld)) {
        System.out.println("2000已经过去了");
    }

    LocalDate dateNew = LocalDate.of(2021, 1, 1);
    if (now.isBefore(dateNew)) {
        System.out.println("2021年还未到来");
    }

}

五、时区

Java 8不仅分离了日期和时间,也把时区分离出来了。现在有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间。

eg: 创建带有时区的日期时间

public static void main(String[] args) {

    // 上海时间
    ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
    ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId);

    // 东京时间
    ZoneId tokyoZoneId = ZoneId.of("Asia/Tokyo");
    ZonedDateTime tokyoZonedDateTime = ZonedDateTime.now(tokyoZoneId);

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println("上海时间: " + shanghaiZonedDateTime.format(formatter));
    System.out.println("东京时间: " + tokyoZonedDateTime.format(formatter));

}

六、格式化

eg1: 使用预定义格式解析与格式化日期

public static void main(String[] args) {

    // 解析日期
    String dateText = "20180924";
    LocalDate date = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE);
    System.out.println("格式化之后的日期=" + date);

    // 格式化日期
    dateText = date.format(DateTimeFormatter.ISO_DATE);
    System.out.println("dateText=" + dateText);

}

eg2:日期和字符串的相互转换

public static void main(String[] args) {

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    // 日期时间转字符串
    LocalDateTime now = LocalDateTime.now();
    String nowText = now.format(formatter);
    System.out.println("nowText=" + nowText);

    // 字符串转日期时间
    String datetimeText = "1999-12-31 23:59:59";
    LocalDateTime datetime = LocalDateTime.parse(datetimeText, formatter);
    System.out.println(datetime);

}

LocalDateTime与上述用法大致相同不予冗余

七、初始-TemporalAdjuster

有时我们可能需要获取例如:将日期调整到“下个周日”等cz

TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现

public static void main(String[] args) {
    LocalDate date = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
    System.out.println(date);
}

七、相关类说明

Instant         // 时间戳
Duration        // 持续时间、时间差
LocalDate       // 只包含日期,比如:2018-09-24
LocalTime       // 只包含时间,比如:10:32:10
LocalDateTime   // 包含日期和时间,比如:2018-09-24 10:32:10
Peroid          // 时间段
ZoneOffset      // 时区偏移量,比如:+8:00
ZonedDateTime   // 带时区的日期时间
Clock           // 时钟,可用于获取当前时间戳
java.time.format.DateTimeFormatter      //时间格式化类
TemporalAdjuster	// 矫正器

水平一般,能力有限,只能提供一些简单参考,深入学习还需自己尝试,承蒙各位不弃,欢迎批评补正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值