天文台Jdk8 supportted DateUtil

By admin in 天文台 on 2018年9月28日

Jdk8 supportted DateUtil


jdk8带来了有的排列的反。新的日期/时间api是最好让欢迎的改变有。
为有利于了解新日期/时间之特点,有必要让咱想起一下“时间相关的基本概念”。

格林威/尼治标准日之来路

日是物质的移位、变化的连绵、顺序性的变现。
头,世界各地都以好的日啊标准在开展各种人类活动。在1884年做的华盛顿国际经度会议达到,为了定义大家还合并遵守的时日标准,便规定了国际标准时间的定义。

它们要求全球限量外且以零经度线达之年月作国际及联合用的科班日。
因为零经度线通过英国格林尼治天文台,所以国际标准时间呢叫格林尼治时间,又如世界经常/标准时。

趁一代前进,现在格林尼治时间已经不再受用作标准日使。新的标准时间,是出于原子钟报时的协调世界时,也号称UTC。

时区与时差

为克服时间达之乱,1884年底华盛顿国际经度会议及,又以世界划分为24只时区。分别吗:
叫称作“零时区”的英国时区,以及因零时区为法的东1-12区,西1-12区。
每个相邻时区之间的时差也1时。由于中国被分到之时区为东-8区,所以中国同英国底时差也8小时。
就此,中国底时空应该吗 UTC 时间重新长8钟头。( UTC+8 )

ISO 8601

既然如此定义了光阴概念上之正式,自然为不怕需要定义时间之代表业内。
国际标准化组织概念了《数据存储和交换形式·信息交换·日期和时间的意味方法》,简称
ISO8601,以标准时间的象征专业。
每当业内被,定义了日期,时间,日期+时间等代表方法。

里头,最常用的日期与时间之成代表法为:
当象征北京时间2004年5月3日下午5点30分割8秒,可以描绘成

2004-05-03T17:30:08+08:00

20040503T173008+08

高中级的T用以界别日期以及时光。

计算机中之辰[\[1\]](https://www.jianshu.com/p/52e97d307268#fn1)

每当微机被,时间是通过数字来表示的。
咱俩拿1970年1月1日 00:00:00 UTC+00:00经常区(零时区)的时刻称为 epoch
time,记为0(1970年以前的流年 timestamp 为负数),当前光阴即是对立于
epoch time 的秒数,称为 timestamp。
而可认为:

timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00

对应的北京时间则为:

timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00

可见 timestamp 的值和时区毫无关系,因为 timestamp 一旦确定,其 UTC
时间便规定了,转换到任意时区底时光吗是完全确定的,这即是干吗计算机存储的时时空是因
timestamp 表示的,因为全球各地之电脑在任意时刻的 timestamp
都是完全相同的。

JDK8所带动的时间变革[\[2\]](https://www.jianshu.com/p/52e97d307268#fn2)

若是您对 Java 混乱的日期操作烦恼不已,那么恭喜您!
新版 API 拥有以下这些激动人心的特色,让您生出尽的理由彻底告别
Calendar,Date,TimeZone 等目标。

  • 不变性
    新的日子/时间API中,所有的好像都是不可变的,这对准多线程环境产生好处。
    关注点分离:新的API将丁可是读之日子时与机器时(unix
    timestamp)明确分离,它为日期(Date)、时间(Time)、日期时(DateTime)、时间戳(unix
    timestamp)以及时区定义了不同的切近
  • 清晰
    当拥有的切近吃,方法还叫醒目概念用以完成同样的行事。举个例子,要用到即实例我们得下now()方法,在备的切近吃还定义了format()和parse()方法,而非是比如说以前那么专门来一个单身的好像。为了重新好的拍卖问题,所有的类都使用了厂模式和方针模式,一旦你以了里面有类的法门,与另外类协同工作并无困难。
  • 实用操作
    不无新的日期/时间API类都落实了一致雨后春笋措施用以完成通用的天职,如:加、减、格式化、解析、从日期/时间被取单独部分,等等。
    而是扩展性:新的日子/时间API是办事以 ISO-8601
    日历系统及之,但咱啊堪以那个利用在非IOS的日历上。

DateUtil in JDK8

JDK8日期/时间API常用类简介:

  • LocalDateTime:常用日期时相近。
  • Instant:时间戳。
  • Period:顾名思义,一段时间!你掌握该怎么用了咔嚓?
  • DayOfWeek:与周相关的信息,选客即便没错了!注意这是一个枚举。还记得枚举中每个品种且负有自己的value这个定义吧?
  • TemporalAdjusters:时间调节器。通过调解器能够取得到因指定日期为根基的某某特定日期。,比如说,可以找到某月的率先龙或者最后一天。
  • DateTimeFom天文台atter:格式化类,解析日期对象的接近。现在他终究是线程安全的了。

/**
 * 日期工具
 *
 * @author lincanhan
 */
public class DateUtil {

    public static final ZoneId chinaZone = ZoneId.systemDefault();


    /**
     * 日期时间对象转换为日期对象
     *
     * @param localDateTime 日期时间对象
     * @return 日期对象
     */
    public static LocalDate dateTime2Date(LocalDateTime localDateTime) {
        return localDateTime.toLocalDate();

    }

    /**
     * 日期对象转换为日期对象
     *
     * @param localDate 日期对象
     * @return 日期时间对象
     */
    public static LocalDateTime date2DateTIme(LocalDate localDate) {
        return LocalDateTime.of(localDate, LocalTime.NOON);
    }


    /**
     * 字符串转换为日期
     *
     * @param strDate 字符串日期
     * @return 日期对象 yyyy-mm-dd
     */
    public static LocalDate str2Date(String strDate) {
        return LocalDate.parse(strDate, DateTimeFormatter.ISO_DATE);
    }


    /**
     * 日期对象转换为字符串
     *
     * @param localDate 日期对象
     * @return 日期字符串 yyyy-mm-dd
     */
    public static String date2Str(LocalDate localDate) {
        return localDate.format(DateTimeFormatter.ISO_DATE);
    }


    /**
     * 日期时间对象转换为字符串
     *
     * @param localDateTime     日期时间对象
     * @param dateTimeFormatter 格式化字符串
     * @return 日期字符串
     */
    public static String dateTime2Str(LocalDateTime localDateTime, String dateTimeFormatter) {
        return localDateTime.format(DateTimeFormatter.ofPattern(dateTimeFormatter));
    }

    /**
     * 日期时间转字符串函数
     * 返回ISO标准的日期字符串
     *
     * @param localDateTime 日期时间对象
     * @return 日期字符串
     */
    public static String dateTime2Str(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ISO_DATE_TIME);
    }

    /**
     * 计算两个日期之间相差的天数
     *
     * @param date1 起始日期
     * @param date2 结束日期
     * @return
     */
    public static int daysBetween(LocalDate date1, LocalDate date2) {
        Period period = Period.between(date1, date2);
        return period.getDays();
    }

    /**
     * 计算两个日期之间相差的月数
     *
     * @param date1 起始日期
     * @param date2 结束日期
     * @return
     */
    public static int monthsBetween(LocalDate date1, LocalDate date2) {
        Period period = Period.between(date1, date2);
        return period.getMonths();
    }

    /**
     * 计算两个日期之间相差的年数
     *
     * @param date1 起始日期
     * @param date2 结束日期
     * @return
     */
    public static int yearsBetween(LocalDate date1, LocalDate date2) {
        Period period = Period.between(date1, date2);
        return period.getYears();
    }

    /**
     * 计算两个日期之间相差的天数
     *
     * @param date1 起始日期
     * @param date2 结束日期
     * @return
     */
    public static int daysBetween(Date date1, Date date2) {
        Instant instantDate1 = date1.toInstant();
        Instant instantDate2 = date2.toInstant();
        LocalDate localDate1 = instantDate1.atZone(chinaZone).toLocalDate();
        LocalDate localDate2 = instantDate2.atZone(chinaZone).toLocalDate();
        instantDate1.atZone(chinaZone);
        Period period = Period.between(localDate1, localDate2);
        return period.getDays();
    }

    /**
     * 计算两个日期之间相差的月数
     *
     * @param date1 起始日期
     * @param date2 结束日期
     * @return
     */
    public static int monthsBetween(Date date1, Date date2) {
        Instant instantDate1 = date1.toInstant();
        Instant instantDate2 = date2.toInstant();
        LocalDate localDate1 = instantDate1.atZone(chinaZone).toLocalDate();
        LocalDate localDate2 = instantDate2.atZone(chinaZone).toLocalDate();
        instantDate1.atZone(chinaZone);
        Period period = Period.between(localDate1, localDate2);
        return period.getMonths();
    }

    /**
     * 计算两个日期之间相差的年数
     *
     * @param date1 起始日期
     * @param date2 结束日期
     * @return
     */
    public static int yearsBetween(Date date1, Date date2) {
        Instant instantDate1 = date1.toInstant();
        Instant instantDate2 = date2.toInstant();
        LocalDate localDate1 = instantDate1.atZone(chinaZone).toLocalDate();
        LocalDate localDate2 = instantDate2.atZone(chinaZone).toLocalDate();
        instantDate1.atZone(chinaZone);
        Period period = Period.between(localDate1, localDate2);
        return period.getYears();
    }

    /**
     * 获取指定日期对象当前月的起始日
     *
     * @param localDate 指定日期
     * @return
     */
    public static int getFirstDayInMonth(LocalDate localDate) {
        LocalDate result = localDate.with(TemporalAdjusters.firstDayOfMonth());
        return result.getDayOfMonth();

    }

    /**
     * 获取指定日期对象的当前月的结束日
     *
     * @param localDate 指定日期
     * @return
     */
    public static int getLastDayInMonth(LocalDate localDate) {
        LocalDate result = localDate.with(TemporalAdjusters.lastDayOfMonth());
        return result.getDayOfMonth();
    }


    /**
     * 获取指定日期对象本月的某周某天的日期
     *
     * @param localDate  日期对象
     * @param weekNumber 周
     * @param dayNumber  日
     * @return
     */
    public static LocalDate getLocalDateBydayAndWeek(LocalDate localDate, int weekNumber, int dayNumber) {
        return localDate.with(TemporalAdjusters.dayOfWeekInMonth(weekNumber, DayOfWeek.of(dayNumber)));
    }


}

JDK8的日期API优雅凝练,我看大部分状就不使DateUtil,也未会见受工作代码混乱不堪。

总结

  1. JDK8日期/时间API设计优雅,使用方便,命名清晰。
  2. 除外优雅的宏图以外,新API保持了一体化的向下兼容能力。
  3. 要您莫是我如此的强迫症患者,在初的路面临完全不应用 DateUtil
    也从来不问题。无论什么需要,你都能由此几句代码轻松答。
  4. 君还有啊理由未以JDK8的品种受到使新API?
  5. 除此之外是 DateUtil
    以外,笔者提供了一个再次详细的新日期API使用示例JDK8DateAPI.java,供参考。

  1. 本小节参考了廖雪峰的官方网站:python教程-datatime
    中之连带段落,有趣味的读者请前往廖先生的官网了解详情。

  2. 本小节参见了importNew-Java8 日期/时间(Date
    Time)API指南遭到的有关段落,有趣味之读者请去importNew了解详情。
    原文链接: journaldev 翻译: ImportNew.com – Justin Wu
    译文链接:
    http://www.importnew.com/14140.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢手机官网 版权所有