java基础—Java8新的日期、时间包

1、Java8新的日期、时间包

  Java 8专门新增了一个java.time包, 该包下包含了如下常用的 类。
  ➢ Clock:该类用于获取指定时区的当前日期、时间。 该类可取 代System类的currentTimeMillis()方法,而且提供了更多方法 来获取当前日期、时间。该类提供了大量静态方法来获取Clock 对象。
  ➢ Duration:该类代表持续时间。该类可以非常方便地获取一段 时间。
  ➢ Instant:代表一个具体的时刻, 可以精确到纳秒。 该类提供 了 静 态 的 now() 方 法 来 获 取 当 前 时 刻 , 也 提 供 了 静 态 的 now(Clock clock)方法来获取clock对应的时刻。除此之外,它 还提供了一系列minusXxx()方法在当前时刻基础上减去一段时 间,也提供了plusXxx()方法在当前时刻基础上加上一段时间。
  ➢ LocalDate:该类代表不带时区的日期, 例如2007-12-03。 该 类提供了静态的now()方法来获取当前日期, 也提供了静态的 now(Clock clock)方法来获取clock对应的日期。除此之外,它 还提供了minusXxx()方法在当前年份基础上减去几年、几月、 几周或几日等,也提供了plusXxx()方法在当前年份基础上加上 几年、几月、几周或几日等。
  ➢ LocalTime:该类代表不带时区的时间, 例如10:15:30。 该 类提供了静态的now()方法来获取当前时间, 也提供了静态的 now(Clock clock)方法来获取clock对应的时间。除此之外,它 还提供了minusXxx()方法在当前年份基础上减去几小时、几 分、几秒等,也提供了plusXxx()方法在当前年份基础上加上几 小时、几分、几秒等。
  ➢ LocalDateTime:该类代表不带时区的日期、时间, 例如200712-03T10:15:30。该类提供了静态的now()方法来获取当前日 期、时间, 也提供了静态的now(Clock clock)方法来获取clock 对应的日期、时间。 除此之外, 它还提供了minusXxx()方法在 当前年份基础上减去几年、几月、几日、几小时、几分、几秒 等, 也提供了plusXxx()方法在当前年份基础上加上几年、几 月、几日、几小时、几分、几秒等。
  ➢ MonthDay:该类仅代表月日, 例如–04-12。 该类提供了静态 的now()方 法 来 获 取 当前 月 日 , 也提 供 了 静 态 的 now(Clock clock)方法来获取clock对应的月日。
  ➢ Year:该类仅代表年, 例如2014。 该类提供了静态的now()方 法来获取当前年份, 也提供了静态的now(Clock clock)方法来 获取clock对应的年份。除此之外,它还提供
法在当前年份基础上减去几年,也提供了plusYears()方法在当 前年份基础上加上几年。
  ➢ YearMonth:该类仅代表年月, 例如2014-04。该类提供了静态的now()方 法 来 获 取 当前 年月 , 也提 供 了 静 态 的 now(Clockclock)方法来获取clock对应的年月。 除此之外, 它还提供了minusXxx()方法在当前年月基础上减去几年、几月, 也提供了plusXxx()方法在当前年月基础上加上几年、几月。
  ➢ ZonedDateTime:该类代表一个时区化的日期、时间。
  ➢ ZoneId:该类代表一个时区。
  ➢ DayOfWeek:这是一个枚举类,定义了周日到周六的枚举值。
  ➢ Month:这也是一个枚举类,定义了一月到十二月的枚举值。
  下面通过一个简单的程序来示范这些类的用法。

public class NewDatePackageTest {
    public static void main(String[] args) {
        // -----下面是关于Clock的用法-----
        // 获取当前Clock
        Clock clock = Clock.systemUTC();
        // 通过Clock获取当前时刻
        System.out.println("当前时刻为:" + clock.instant());
        // 获取clock对应的毫秒数,与System.currentTimeMillis()输出相同
        System.out.println(clock.millis());
        System.out.println(System.currentTimeMillis());
        // -----下面是关于Duration的用法-----
        Duration d = Duration.ofSeconds(6000);
        System.out.println("6000秒相当于" + d.toMinutes() + "分");
        System.out.println("6000秒相当于" + d.toHours() + "小时");
        System.out.println("6000秒相当于" + d.toDays() + "天");
        // 在clock基础上增加6000秒,返回新的Clock
        Clock clock2 = Clock.offset(clock, d);
        // 可以看到clock2与clock1相差1小时40分
        System.out.println("当前时刻加6000秒为:" + clock2.instant());
        // -----下面是关于Instant的用法-----
        // 获取当前时间
        Instant instant = Instant.now();
        System.out.println(instant);
        // instant添加6000秒(即100分钟),返回新的Instant
        Instant instant2 = instant.plusSeconds(6000);
        System.out.println(instant2);
        // 根据字符串解析Instant对象
        Instant instant3 = Instant.parse("2014-02-23T10:12:35.342Z");
        System.out.println(instant3);
        // 在instant3的基础上添加5小时4分钟
        Instant instant4 = instant3.plus(Duration
                .ofHours(5).plusMinutes(4));
        System.out.println(instant4);
        // 获取instant4的5天以前的时刻
        Instant instant5 = instant4.minus(Duration.ofDays(5));
        System.out.println(instant5);
        // -----下面是关于LocalDate的用法-----
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
        // 获得2014年的第146天
        localDate = LocalDate.ofYearDay(2014, 146);
        System.out.println(localDate); // 2014-05-26
        // 设置为2014年5月21日
        localDate = LocalDate.of(2014, Month.MAY, 21);
        System.out.println(localDate); // 2014-05-21
        // -----下面是关于LocalTime的用法-----
        // 获取当前时间
        LocalTime localTime = LocalTime.now();
        // 设置为22点33分
        localTime = LocalTime.of(22, 33);
        System.out.println(localTime); // 22:33
        // 返回一天中的第5503秒
        localTime = LocalTime.ofSecondOfDay(5503);
        System.out.println(localTime); // 01:31:43
        // -----下面是关于localDateTime的用法-----
        // 获取当前日期、时间
        LocalDateTime localDateTime = LocalDateTime.now();
        // 当前日期、时间加上25小时3分钟
        LocalDateTime future = localDateTime.plusHours(25).plusMinutes(3);
        System.out.println("当前日期、时间的25小时3分之后:" + future);
        // -----下面是关于Year、YearMonth、MonthDay的用法示例-----
        Year year = Year.now(); // 获取当前的年份
        System.out.println("当前年份:" + year); // 输出当前年份
        year = year.plusYears(5); // 当前年份再加5年
        System.out.println("当前年份再过5年:" + year);
        // 根据指定月份获取YearMonth
        YearMonth ym = year.atMonth(10);
        System.out.println("year年10月:" + ym); // 输出XXXX-10,XXXX代表当前年份
        // 当前年月再加5年、减3个月
        ym = ym.plusYears(5).minusMonths(3);
        System.out.println("year年10月再加5年、减3个月:" + ym);
        MonthDay md = MonthDay.now();
        System.out.println("当前月日:" + md); // 输出--XX-XX,代表几月几日
        // 设置为5月23日
        MonthDay md2 = md.with(Month.MAY).withDayOfMonth(23);
        System.out.println("5月23日为:" + md2); // 输出--05-23
    }
}

2、Java 8新增的日期、时间格式器

  Java 8新增的日期、时间API里不仅包括了Instant、LocalDate、 LocalDateTime 、 LocalTime 等 代 表 日 期 、 时 间 的 类 , 而 且 在 java.time.format包下提供了一个DateTimeFormatter格式器类,该类 相当于前面介绍的DateFormat和SimpleDateFormat的合体, 功能非常强大。
  与DateFormat、SimpleDateFormat类似, DateTimeFormatter不仅 可以将日期、时间对象格式化成字符串,也可以将特定格式的字符串 解析成日期、时间对象。
  为了使用DateTimeFormatter进行格式化或解析, 必须先获取 DateTimeFormatter对象, 获取DateTimeFormatter对象有如下三种常 见的方式。
    ➢ 直 接 使 用 静 态 常 量 创 建 DateTimeFormatter 格 式 器 。 DateTimeFormatter 类 中 包 含 了 大 量 形 如 ISO_LOCAL_DATE 、 ISO_LOCAL_TIME、ISO_LOCAL_DATE_TIME等静态常量,这些静态 常量本身就是DateTimeFormatter实例。     ➢ 使用代表不同风格的枚举值来创建DateTimeFormatter格式 器。 在FormatStyle枚举类中定义了FULL、LONG、MEDIUM、 SHORT四个枚举值,它们代表日期、时间的不同风格。
    ➢ 根据模式字符串来创建DateTimeFormatter格式器。 类似于 SimpleDateFormat , 可 以 采 用 模 式 字 符 串 来 创 建 DateTimeFormatter, 如果需要了解DateTimeFormatter支持哪 些模式字符串,则需要参考该类的API文档。

2.1、使用DateTimeFormatter完成格式化

  使 用 DateTimeFormatter 将 日 期 、 时 间 ( LocalDate 、 LocalDateTime、LocalTime等实例)格式化为字符串, 可通过如下两 种方式。
  ➢ 调 用 DateTimeFormatter 的 format(TemporalAccessor temporal)方法执行格式化,其中LocalDate、LocalDateTime、 LocalTime等类都是TemporalAccessor接口的实现类。
  ➢ 调用LocalDate、LocalDateTime、LocalTime等日期、时间对 象的format(DateTimeFormatter formatter)方法执行格式化。 上面两种方式的功能相同, 用法也基本相似, 如下程序示范了使 用DateTimeFormatter来格式化日期、时间。

public class NewFormatterTest {
    public static void main(String[] args) {
        DateTimeFormatter[] formatters = new DateTimeFormatter[]{
                // 直接使用常量创建DateTimeFormatter格式器
                DateTimeFormatter.ISO_LOCAL_DATE,
                DateTimeFormatter.ISO_LOCAL_TIME,
                DateTimeFormatter.ISO_LOCAL_DATE_TIME,
                // 使用本地化的不同风格来创建DateTimeFormatter格式器
                DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM),
                DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG),
                // 根据模式字符串来创建DateTimeFormatter格式器
                DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
        };
        LocalDateTime date = LocalDateTime.now();
        // 依次使用不同的格式器对LocalDateTime进行格式化
        for (int i = 0; i < formatters.length; i++) {
            // 下面两行代码的作用相同
            System.out.println(date.format(formatters[i]));
            System.out.println(formatters[i].format(date));
        }
    }
}

  运行上面的查询,根据结果可看出使用DateTimeFormatter进行格式化时不仅可 按系统预置的格式对日期、时间进行格式化,也可使用模式字符串对 日期、时间进行自定义格式化,由此可见,DateTimeFormatter的功能 完全覆盖了传统的DateFormat、SimpleDateFormate的功能。

2.2、使用DateTimeFormatter解析字符串

  为了使用DateTimeFormatter将指定格式的字符串解析成日期、时间对(LocalDate、LocalDateTime、LocalTime等实例),可通过日 期、时间对象提供的parse(CharSequence text, DateTimeFormatter formatter)方法进行解析。
  如下程序示范了使用DateTimeFormatter解析日期、时间字符串。

public class NewFormatterParse {
    public static void main(String[] args) {
        // 定义一个任意格式的日期时间字符串
        String str1 = "2014==04==12 01时06分09秒";
        // 根据需要解析的日期、时间字符串定义解析所用的格式器
        DateTimeFormatter fomatter1 = DateTimeFormatter.ofPattern("yyyy==MM==dd HH时mm分ss秒");
        // 执行解析
        LocalDateTime dt1 = LocalDateTime.parse(str1, fomatter1);
        System.out.println(dt1); // 输出 2014-04-12T01:06:09
        // ---下面代码再次解析另一个字符串---
        String str2 = "2014$$$4月$$$13 20小时";
        DateTimeFormatter fomatter2 = DateTimeFormatter.ofPattern("yyy$$$MMM$$$dd HH小时");
        LocalDateTime dt2 = LocalDateTime.parse(str2, fomatter2);
        System.out.println(dt2); // 输出 2014-04-13T20:00

    }
}

  上面程序中定义了两个不同格式的日期、时间字符串, 为了解析 它们, 程序分别使用对应的格式字符串创建了DateTimeFormatter对 象,这样DateTimeFormatter即可按该格式字符串将日期、时间字符串 解析成LocalDateTime对象。编译、运行该程序,即可看到两个日期、 时间字符串都被成功地解析成LocalDateTime。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值