zoukankan      html  css  js  c++  java
  • 如何在Java 8中愉快地处理日期和时间

    Java 8新增了LocalDateLocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。

    java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。

    java.util.DateSimpleDateFormatter都不是线程安全的,而LocalDateLocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。

    java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java 8中,日期和时间被明确划分为LocalDateLocalTimeLocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。

    新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。

    LocalDate

    看看新的LocalDate怎么用:

    // 取当前日期:
    LocalDate today = LocalDate.now(); // -> 2014-12-24
    // 根据年月日取日期,12月就是12:
    LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
    // 根据字符串取:
    LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
    LocalDate.parse("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date
    

    日期转换经常遇到,比如:

    // 取本月第1天:
    LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
    // 取本月第2天:
    LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
    // 取本月最后一天,再也不用计算是28,29,30还是31:
    LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
    // 取下一天:
    LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01
    // 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:
    LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05
    

    LocalTime

    LocalTime只包含时间,以前用java.util.Date怎么才能只表示时间呢?答案是,假装忽略日期。

    LocalTime包含毫秒:

    LocalTime now = LocalTime.now(); // 11:09:09.240
    

    你可能想清除毫秒数:

    LocalTime now = LocalTime.now().withNano(0)); // 11:09:09
    

    构造时间也很简单:

    LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
    LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00
    

    时间也是按照ISO格式识别,但可以识别以下3种格式:

    • 12:00
    • 12:01:02
    • 12:01:02.345

    JDBC

    最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:

    SQL -> Java
    --------------------------
    date -> LocalDate
    time -> LocalTime
    timestamp -> LocalDateTime
    

    再也不会出现映射到java.util.Date其中日期或时间某些部分为0的情况了。

    最后总结一下,怎么才能愉快地处理日期和时间?答案是:立刻升级到Java 8!

    http://www.liaoxuefeng.com/article/00141939241051502ada88137694b62bfe844cd79e12c32000

  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/softidea/p/6047776.html
Copyright © 2011-2022 走看看