Fork me on GitHub

Java8 Time API与老Date之间的转换

    前面我已经总结了Java8 Time API常用的一些方法、封装的工具类,可是最近需要对一个比较老的项目进行重构,大致看了一下使用的Jdk还是7而且里面的时间工具类还是使用的Date和Calendar。既然是项目重构,我的第一想法是Jdk版本必须得升一升,和同事商量后还是决定使用Java8(本人比较看好Java 9中的HTTP/2,奈何9版本广受诟病,而10中局部变量类型推断对于习惯于强类型定义的Javaer还是一时半会难以接收,最终还是选择了Java8),另外Spring项目也该换成Spring cloud微服务项目了吧(听说最近Spring cloud alibaba大火,有空去研究研究.)。呃,有点跑远了,还是回到我们主题,来介绍一下Date如何转换成Java8 Time API吧。

  在Java官方社区里面了解到,Time API提供了方法将Date转换为LocalDate,不过并非直接转换,而是通过ZonedDateTime。

  下面我先来详细的介绍Date转换成LocalDate的方法

1)将java.util.Date转换为ZonedDateTime。
2)使用它的toLocalDate()方法从ZonedDateTime获取LocalDate。

  代码示例

复制代码
public static void main(String[] args) {
        Date date = new Date();
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();

        // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        System.out.println("Date = " + date);
        System.out.println("LocalDate = " + localDate);
}
----------------------
Date = Fri Jun 16 15:29:05 CST 2017
LocalDate = 2017-06-16
复制代码

  LocalDate转换为Date的方法

1)使用ZonedDateTime将LocalDate转换为Instant。
2)使用from()方法从Instant对象获取Date的实例

  代码示例

复制代码
public static void main(String[] args) {
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate localDate = LocalDate.now();
        ZonedDateTime zdt = localDate.atStartOfDay(zoneId);

        Date date = Date.from(zdt.toInstant());

        System.out.println("LocalDate = " + localDate);
        System.out.println("Date = " + date);

 }
----------------------
LocalDate = 2017-06-16
Date = Fri Jun 16 00:00:00 CST 2017
复制代码

 

ps:最后补充一个能很好展示新旧API转换的工具类

复制代码
 /**
     * 获取本周开始日期
     * time Date格式
     *
     * @return LocalDate格式
     */
    public static LocalDate getFirstDayOfWeek(Date time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");//设置时间格式
        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        int day = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);//根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        LocalDate date = LocalDate.parse(sdf.format(cal.getTime()),dtf);
        return date;
    }
复制代码

 

 

  

作者:JackpotHan
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   JackpotHan  阅读(784)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示