Jdk8 supportted DateUtil

By admin in 天文台 on 2019年1月13日

Jdk8 supportted DateUtil


jdk8带来了一些列的改动。新的日子/时间api是最受欢迎的改观之一。
为了便利明白新日期/时间的特点,有必不可少让我们记忆一下“时间相关的基本概念”。

格林(格林)威/尼治标准时间的来头

日子是物质的移位、变化的持续性、顺序性的展现。
早期,世界各地都遵照自己的时光为正式在拓展各样人类活动。在1884年举办的华盛顿国际经度会议上,为了定义咱们都统一听从的年月标准,便规定了国际标准时间的概念。

它要求全球限量内皆以零经度线上的时刻作为国际上联合行使的正经时间。
因为零经度线通过英帝国格林(格林)尼治天文台,所以国际标准时间也称为格林尼治时间,又称世界时/标准时。

乘机时代前进,现在格林(格林(Green))尼治时间已经不再被当作规范时间利用。新的正儿八经时间,是由原子钟报时的协调世界时,也号称UTC。

时区与时差

为了制服时间上的乱七八糟,1884年的华盛顿(华盛顿(Washington))国际经度会议上,又将大地划分为了24个时区。分别为:
被称作“零时区”的U.K.时区,以及以零时区为规范的东1-12区,西1-12区。
各类相邻时区之间的时差为1刻钟。由于中国被分割到的时区为东-8区,所以中国与英国的时差为8钟头。
天文台,故,中国的日子应当为 UTC 时间再增长8钟头。( UTC+8 )

ISO 8601

既然如此定义了时光概念上的科班,自然也就需要定义时间的代表业内。
国际标准化社团概念了《数据存储和交流模式·信息互换·日期和时间的代表方法》,简称
ISO8601,以正规化时间的意味专业。
在正儿八经中,定义了日期,时间,日期+时间等表示方法。

中间,最常用的日子和岁月的构成表示法为:
在象征上海时间2004年11月3日午后5点30分8秒,可以写成

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

20040503T173008+08

高中级的T用以分别日期与时间。

处理器中的时间[\[1\]](https://www.jianshu.com/p/52e97d307268#fn1)

在电脑中,时间是经过数字来代表的。
我们把1970年九月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,提姆(Tim)eZone 等目的。

  • 不变性
    新的日期/时间API中,所有的类都是不可变的,这对多线程环境有实益。
    关注点分离:新的API将人可读的日未时间和机械时间(unix
    timestamp)明确分离,它为日期(Date)、时间(提姆e)、日期时间(Date提姆e)、时间戳(unix
    timestamp)以及时区定义了不同的类
  • 清晰
    在所有的类中,方法都被强烈概念用以完成同样的行为。举个例子,要得到目前实例我们得以应用now()方法,在具备的类中都定义了format()和parse()方法,而不是像在此以前那么专门有一个独门的类。为了更好的拍卖问题,所有的类都使用了工厂格局和政策情势,一旦你利用了内部某个类的点子,与另外类协同工作并不困难。
  • 实用操作
    抱有新的日子/时间API类都落实了一序列措施用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。
    可扩张性:新的日子/时间API是干活在 ISO-8601
    日历系统上的,但我们也足以将其采用在非IOS的日历上。

DateUtil in JDK8

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

  • LocalDate提姆(Tim)e:常用日期时间类。
  • Instant:时间戳。
  • Period:顾名思义,一段时间!你知道该怎么用了啊?
  • DayOfWeek:与周相关的音信,选她就没错了!注意这是一个枚举。还记得枚举中各类系列都享有和谐的value这一个概念呢?
  • TemporalAdjusters:时间调节器。通过调解器可以拿到到以指定日期为底蕴的某部特定日期。,比如说,可以找到某月的第一天或最后一天。
  • Date提姆(Tim)eFomatter:格式化类,解析日期对象的类。现在她终于是线程安全的了。

/**
 * 日期工具
 *
 * @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)(Justin) Wu
    译文链接:
    http://www.importnew.com/14140.html

发表评论

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

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