【jdk1.8特性】之LocalDateTime与DateTimeFormatter

声明一学习完本文知识以及上一篇博客Instant的知识后,我们就可以使用Instant、LocalDateTime、
               DateTimeFormatter来取代Date、Calendar,SimpleDateFormatle了。
               提示:Calendar和SimpleDateFormatle都是线程不安全的,(无论程序是不是多线程,
                          都)不建议使用Calendar和SimpleDateFormatle;建议使用优雅的Instant、
                          LocalDateTime、DateTimeFormatter来取代Date、Calendar,
                          SimpleDateFormatle。

声明二本文着重示例LocalDateTime,在这个过程中,自然而然就会顺带简单使用DateTimeFormatter。

声明三本文所涉及的日期类,都在java.time.*包下。


目录


LocalDateTime与DateTimeFormatter使用示例

  • 获取当前(本地)时间

/**
 * 获取 当前(本地)时间
 */
@Test
public void test1() {
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime);
}

运行结果(示例):

  • 获取年、月、日、时、分、秒

/**
 * 获取 年、月、日、时、分、秒
 */
@Test
public void test2() {
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("当前时间 -> 【" + localDateTime + "】");
    // -> 获取年(等价于: .get(ChronoField.YEAR))
    System.out.println("----------------年相关");
    int year = localDateTime.getYear();
    System.out.println("\tgetYear()结果是int -> " + year);


    // -> 获取月
    System.out.println("----------------月相关");
    // 等价于: .get(ChronoField.MONTH_OF_YEAR)
    int monthValue = localDateTime.getMonthValue();
    System.out.println("\tgetMonthValue()结果是int -> " + monthValue);
    Month month = localDateTime.getMonth();
    System.out.println("\tgetMonth()结果是Month -> " + month);

    // -> 获取日
    System.out.println("----------------日相关");
    // 等价于: .get(ChronoField.DAY_OF_YEAR)
    int dayOfYear = localDateTime.getDayOfYear();
    System.out.println("\tgetDayOfYear()结果是int -> " + dayOfYear);
    // 等价于: .get(ChronoField.DAY_OF_MONTH)
    int dayOfMonth = localDateTime.getDayOfMonth();
    System.out.println("\tgetDayOfMonth()结果是int -> " + dayOfMonth);
    DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
    System.out.println("\tgetDayOfWeek()结果是DayOfWeek -> " + dayOfWeek);

    System.out.println("----------------时、分、秒相关");
    // -> 获取时(等价于: .get(ChronoField.HOUR_OF_DAY))
    int hour = localDateTime.getHour();
    System.out.println("\tgetHour()结果是int -> " + hour);
    // -> 获取分(等价于: .get(ChronoField.MINUTE_OF_HOUR))
    int minute = localDateTime.getMinute();
    System.out.println("\tgetMinute()结果是int -> " + minute);
    // -> 获取秒(等价于: .get(ChronoField.SECOND_OF_MINUTE))
    int second = localDateTime.getSecond();
    System.out.println("\tgetSecond()结果是int -> " + second);
}

运行结果(示例):

  • 字符串与日期互相转换

/**
 * 字符串 与 日期  互相转换
 */
@Test
public void test3() {
    // 设置格式
    // 注:DateTimeFormatter是线程安全的
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    LocalDateTime now = LocalDateTime.now();

    // LocalDateTime 转换为 String
    // 等价于: String result = dateTimeFormatter.format(now);
    String result = now.format(dateTimeFormatter);
    System.out.println(result);

    // String 转换为 LocalDateTime
    String oneDayAfter = "1994-02-05 11:33:46";
    // 等价于: LocalDateTime localDateTime =  LocalDateTime.from(dateTimeFormatter.parse(oneDayAfter));
    LocalDateTime localDateTime = LocalDateTime.parse(oneDayAfter, dateTimeFormatter);
    System.out.print(localDateTime.getYear() + "年\t");
    System.out.print(localDateTime.getMonthValue() + "月\t");
    System.out.print(localDateTime.getDayOfMonth() + "日\t");
    System.out.print(localDateTime.getHour() + "时\t");
    System.out.print(localDateTime.getMinute() + "分\t");
    System.out.print(localDateTime.getSecond() + "秒");
}

运行结果(示例):

  • 比较两个LocalDateTime之间的早晚

/**
 * 比较两个LocalDateTime之间的早晚
 */
@Test
public void test4() {
    // 获取格式化器
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime a = LocalDateTime.parse("2019-08-13 00:00:00", dateTimeFormatter);
    System.out.println("a -> 【" + a + "】");
    LocalDateTime b = LocalDateTime.parse("2019-08-12 00:00:00", dateTimeFormatter);
    System.out.println("b -> 【" + b + "】");

    /// 方式一-------------------------------------- compareTo
    // 比较两个LocalDateTime之间的早晚, a.compareTo(b),
    //     若: a - b > 0 则返回 1, 表示: a晚于b
    //     若: a - b = 0 则返回 0   表示: a等于b
    //     若: a - b < 0 则返回 -1  表示: a早于b
    System.out.println("\n方式一----------------- compareTo");
    int result = a.compareTo(b);
    System.out.println(result > 0 ? "a晚于b" : result == 0 ? "a等于b" : "a早于b");

    /// 方式二-------------------------------------- isAfter、isBefore、isEqual
    System.out.println("\n方式二----------------- isAfter、isBefore、isEqual");
    boolean isAfterResult = a.isAfter(b);
    System.out.println("a晚于b? --- " + isAfterResult);
    boolean isBeforeResult = a.isBefore(b);
    System.out.println("a早于b? --- " + isBeforeResult);
    boolean isEqualResult = a.isEqual(b);
    System.out.println("a等于? --- " + isEqualResult);
}

运行结果(示例):

  • 日期的加、减

/**
 * 日期的 加 减
 */
@Test
public void test5() {
    // 获取当前时间
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("当前时间是 -> " + localDateTime);

    // + 1 天
    LocalDateTime plusRes = localDateTime.plus(1, ChronoUnit.DAYS);
    System.out.println("一天后是  -> " + plusRes);

    // - 2 天
    LocalDateTime minusRes = localDateTime.minus(2, ChronoUnit.DAYS);
    System.out.println("两天前是  -> " + minusRes);
}

运行结果(示例):

  • LocalDateTime与时间偏移量的相互转换

/**
 * LocalDateTime 与 时间偏移量 的相互转换
 *
 * 注:偏移量从 1970-01-01 00:00:00 开始算
 */
@Test
public void test6() {
    System.out.println(" System.currentTimeMillis : " + System.currentTimeMillis());
    // 获取当前时间
    LocalDateTime localDateTime = LocalDateTime.now();

    // LocalDateTime  =>  时间偏移量(毫秒)
    long offSetMilliSecond = localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    System.out.println(" LocalDateTime  =>  时间偏移量(毫秒) : " + offSetMilliSecond);

    // LocalDateTime  =>  时间偏移量(秒)
    long offSetSecond = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
    System.out.println(" LocalDateTime  =>  时间偏移量(秒) : " + offSetSecond);

    // -> 时间偏移量(毫秒)  =>  LocalDateTime
    // 第一步,先获得当前指向UTC的瞬时时间
    //       注意:此时并不需要将Instant再转换为执行北京时间的 瞬时时间
    Instant tmpStant1 = Instant.ofEpochMilli(System.currentTimeMillis());
    // 第二步:通过(指向UTC的)瞬时时间 + 时区,得到(指向本地的)LocalDateTime
    LocalDateTime localDateTime1 = LocalDateTime.ofInstant(tmpStant1, ZoneId.systemDefault());
    System.out.println(" 时间偏移量(毫秒)  =>  LocalDateTime : " + localDateTime1);

    // -> 时间偏移量(秒)  =>  LocalDateTime
    // 第一步,先获得当前指向UTC的瞬时时间
    //       注意:此时并不需要将Instant再转换为执行北京时间的 瞬时时间
    Instant tmpStant2 = Instant.ofEpochSecond(System.currentTimeMillis() / 1000);
    // 第二步:通过(指向UTC的)瞬时时间 + 时区,得到(指向本地的)LocalDateTime
    LocalDateTime localDateTime2 = LocalDateTime.ofInstant(tmpStant2, ZoneId.systemDefault());
    System.out.println(" 时间偏移量(秒)  =>  LocalDateTime : " + localDateTime2);
}

运行结果(示例):

  • 计算两个LocalDateTime之间的时间差

/**
 * 计算两个LocalDateTime之间的时间差
 */
@Test
public void test7() {
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime a = LocalDateTime.parse("1994-02-05 11:23:30", dateTimeFormatter);
    System.out.println("a -> 【" + a + "】");
    LocalDateTime b = LocalDateTime.parse("2019-08-11 13:45:24", dateTimeFormatter);
    System.out.println("b -> 【" + b + "】");

    /*
     * 注意: a.until(b, xxx), 是计算a到b的时间差的, 是用 “b - a”的,
     *      如果a.until(b, xxx)为正数,那么b.until(a, xxx)就一定为
     *      负数
     */
    // 相差 年 数
    long diffYear = a.until(b, ChronoUnit.YEARS);
    System.out.println(" a 到 b, 相差年数为 : " + diffYear);
    // 相差 月 数
    long diffMonth = a.until(b, ChronoUnit.MONTHS);
    System.out.println(" a 到 b, 相差月份数为 : " + diffMonth);
    // 相差 日 数
    long diffDay = a.until(b, ChronoUnit.DAYS);
    System.out.println(" a 到 b, 相差天数为 : " + diffDay);
    // 相差 时 数
    long diffHour = a.until(b, ChronoUnit.HOURS);
    System.out.println(" a 到 b, 相差月小时数为 : " + diffHour);
    // 相差 分 数
    long diffMinutes = a.until(b, ChronoUnit.MINUTES);
    System.out.println(" a 到 b, 相差分钟数为 : " + diffMinutes);
    // 相差 秒 数
    long diffSeconds = a.until(b, ChronoUnit.SECONDS);
    System.out.println(" a 到 b, 相差秒数为 : " + diffSeconds);
    // 相差 毫秒 数
    long diffMilliSeconds = a.until(b, ChronoUnit.MILLIS);
    System.out.println(" a 到 b, 相差毫秒数为 : " + diffMilliSeconds);

}

运行结果(示例):

 

^_^ 如有不当之处,欢迎指正

^_^ 参考文档
 
            《jdk api 1.8_google.CHM》

^_^ 测试代码托管链接
               
https://github.com/JustryDeng…Jdk8Feature

^_^ 本文已经被收录进《程序员成长笔记(五)》,笔者JustryDeng

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值