当前位置: 代码网 > it编程>编程语言>Java > Java中各类日期和时间转换超详析总结(Date和LocalDateTime相互转换等)

Java中各类日期和时间转换超详析总结(Date和LocalDateTime相互转换等)

2025年01月19日 Java 我要评论
一、前言大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换!从 java1 到 java8 将近 20 年,再加上 java8 的普及时间、各种历史 api 兼容

一、前言

大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换!
从 java1 到 java8 将近 20 年,再加上 java8 的普及时间、各种历史 api 兼容过渡时间。我们很多时候需要在旧时间 api 与新时间 api 之间切换,并行使用!!!
每次写完就忘记了,小编专门来整理一篇来详细说一下他们转换的方法,方便后面使用!!

在java开发中,日期和时间的处理随着jdk的迭代发展经历了几个阶段,从最初的java.util.datejava.util.calendar到java 8(java.time包下的类)引入全新的日期时间api。现今在java中,jdk提供了多种日期和时间相关类,主要包括以下几种:

  • java.util.date:这是java最早提供的日期和时间类表示特定的时间瞬间,精确到毫秒。可以通过system.currenttimemillis()来获取当前时间的毫秒表示。
  • java.sql.date:这是为数据库应用设计的日期类,只包含年、月、日信息,不包含时间和时区信息。
  • java.sql.time:类似java.sql.date,但它只包含小时、分钟和秒信息。
  • java.sql.timestamp:这是一个比java.util.date更加精确的时间戳类,它可以精确到纳秒级别。
  • java.util.calendarjava.util.gregoriancalendar:calendar是一个抽象类,提供了日期和时间的计算方法。gregoriancalendarcalendar的一个具体实现,用于处理公历(格里高利历)。
  • java.time包中的类:在java 8及以上版本,推荐使用java.time包中的类来处理日期和时间,因为它们设计更加合理且功能更加强大。主要类包括localdatelocaltimelocaldatetimezoneddatetimeinstantdurationperiod等。

二、日期格式转换

localdatetime 和 date 互相转换

date 转 localdatetime、localdate、localtime

要将java.util.date转换为localdate、localtime或localdatetime,可以使用java.time.instant类作为中间桥梁,因为instant类可以表示时间线上的一个瞬时点,与java.util.date有相似的用途(尽管instant是以utc表示的,而date是相对于默认时区的)。

java8 发行的时候,也考虑到了新旧 api 之间的转换,所以在java.util.date中增加了toinstance()方法,可以得到一个instance实例。instance表示时间线上的一个瞬时点,没有时区概念,所以我们需要通过atzone()指定时区,得到zoneddatetime实例,然后转换为java.time.localdatetime

如下:

date datenow = new date();

localdatetime localdatetime = datenow.toinstant()
                .atzone(zoneid.systemdefault())
                .tolocaldatetime()

localdate localdate = datenow.toinstant()
                .atzone(zoneid.systemdefault())
                .tolocaldate();

localtime localtime = datenow.toinstant()
                .atzone(zoneid.systemdefault())
                .tolocaltime();

同样的,我们也可以借助instance的ofepochmilli()方法创建实例。如下:

date datenow = new date();

localdatetime localdatetime = instant.ofepochsecond(datenow.gettime())
                .atzone(zoneid.systemdefault())
                .tolocaldatetime();

localdate localdate = instant.ofepochsecond(datenow.gettime())
                .atzone(zoneid.systemdefault())
                .tolocaldate();

localtime localtime = instant.ofepochsecond(datenow.gettime())
                .atzone(zoneid.systemdefault())
                .tolocaltime();
}

在上述示例中,首先将java.util.date对象转换为java.time.instant,然后通过atzone(zoneid.systemdefault())方法将其转换为特定时区(这里是系统默认时区)的zoneddatetime对象。由于localdate、localtime和localdatetime都是时区无关的(对于localdatetime来说,它实际上是“本地”的,不包含时区信息,但在这里通过指定时区来从instant获取它),最后通过调用.tolocaldate()、.tolocaltime()或.tolocaldatetime()方法将它们从zoneddatetime中提取出来。

注意,在转换过程中,需要指定一个时区,因为java.util.date本身并不包含时区信息,它只是自epoch以来的毫秒数。因此,在转换为localdate、localtime或localdatetime时,需要明确想要哪个时区的日期或时间。如果想要的是utc时间,你可以使用zoneid.of(“utc”)代替zoneid.systemdefault()。

localdatetime、localdate、localtime 转 date

localdatetime localdatetime = localdatetime.now();
date datefromlocaldatetime = date.from(localdatetime.atzone(zoneid.systemdefault()).toinstant());

// 由于`localdate`不带有时间信息,所以必须设置时间,才能转 date。atstartofday,自动赋予午夜时间,返回 localdatetime,设置时区返回 zoneddatetime,进而得到 instant
localdate localdate = localdate.now();
date datefromlocaldate = date.from(localdate.atstartofday().atzone(zoneid.systemdefault()).toinstant());

// 由于`localdate`不带有日期信息,所以必须设置日期,才能转 date。
localtime localtime = localtime.now();
date datefromlocaltime = date.from(localtime.atdate(localdate.now()).atzone(zoneid.systemdefault()).toinstant());

localdatetime 和 string 互相转换

localdatetime 转 string

localdate类有一个format()方法,可以将日期转成字符串。format()方法需要一个datetimeformatter对象作为参数。

datetimeformatter datetimeformatter = datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss");
string datetimestr = localdatetime.now().format(datetimeformatter);

string 转 localdatetime

我们可以使用parse()方法从字符串中解析日期对象

string datetimestr = localdatetime.now().format(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss"));
localdatetime localdatetime = localdatetime.parse(datetimestr);

localdatetime 和 instant 互相转换

localdatetime表示没有时区的日期时间,如2019-10-25t12:15:30,而instant是时间线上的一个瞬时点。

localdatetime 转 instant

localdatetime localdatetime = localdatetime.now();

instant instant;
//第一种方式:using localdatetime.toinstant()
instant = localdatetime.toinstant(zoneoffset.utc);

//第二种方式:using localdatetime.atzone() and instant.atzone()
instant =localdatetime.atzone(zoneid.systemdefault()).toinstant();

//第三种方式:using localdatetime.toepochsecond() and instant.ofepochsecond()
long timeinseconds = localdatetime.toepochsecond(zoneoffset.utc);
instant = instant.ofepochsecond(timeinseconds);

instant 转 localdatetime

//using localdatetime.ofinstant
localdatetime localdatetime = localdatetime.ofinstant(instant.now(), zoneid.systemdefault());

long timeinseconds = 1567109422l;
localdatetime = localdatetime.ofinstant(instant.ofepochsecond(timeinseconds), zoneid.systemdefault());

localdatetime = localdatetime.ofinstant(instant.ofepochsecond(timeinseconds, 0), zoneid.systemdefault());

long timeinmillis = 1567109422123l;
localdatetime = localdatetime.ofinstant(instant.ofepochmilli(timeinmillis), zoneid.systemdefault());

//using timestamp
localdatetime = timestamp.from(instant.now()).tolocaldatetime(); 

date 和 string 互相转换

date 转 string

dateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");
date now = new date();
string datestr = df.format(now);

string 转 date

dateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");
date now = new date();
string datestr = df.format(now);
date date = df.parse(datestr);

总结 

到此这篇关于java中各类日期和时间转换的文章就介绍到这了,更多相关java date和localdatetime相互转换内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com