一、前言
大家在开发过程中必不可少得和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转换!
从 java1 到 java8 将近 20 年,再加上 java8 的普及时间、各种历史 api 兼容过渡时间。我们很多时候需要在旧时间 api 与新时间 api 之间切换,并行使用!!!
每次写完就忘记了,小编专门来整理一篇来详细说一下他们转换的方法,方便后面使用!!
在java开发中,日期和时间的处理随着jdk的迭代发展经历了几个阶段,从最初的java.util.date
和java.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.calendar
和java.util.gregoriancalendar
:calendar是一个抽象类,提供了日期和时间的计算方法。gregoriancalendar
是calendar
的一个具体实现,用于处理公历(格里高利历)。java.time
包中的类:在java 8及以上版本,推荐使用java.time
包中的类来处理日期和时间,因为它们设计更加合理且功能更加强大。主要类包括localdate
、localtime
、localdatetime
、zoneddatetime
、instant
、duration
、period
等。
二、日期格式转换
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相互转换内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论