如何在Java 8中愉快地js中处理日期格式和时间 廖雪峰的

Java8里面的日期操作整理 - CSDN博客
Java8里面的日期操作整理
为什么我们需要新的Java日期/时间API?
1、Java的日期/时间类定义并不一致,在java.util与java.sql里面都有日期类,格式化与解析的类又定义在java.text包里面。
2、java.util.Date同时包含日期与时间,而java.sql.Date仅包含日期,而且这两个类相同名字。设计不好
3、对时间、时间戳、格式化与解析,并没有一些明确的类,对格式化和解析的需求,一般用SimpleDateFormat类。
4、所有日期类都是可变的,线程不安全
5、日期类不支持国际化,没有时支持。
新的日期/时间API的一些设计原则是:
Java日期/时间API包含以下相应的包。
从这几个API类来看其实我们更多的是用java.time包里面的东西就行了。重点是用LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration
常见的API操作
1. java.time.LocalDate:LocalDate是一个不可变的类,它表示默认格式(yyyy-MM-dd)的日期,我们可以使用now()方法得到当前时间,也可以提供输入年份、月份和日期的输入参数来创建一个LocalDate实例。该类为now()方法提供了重载方法,我们可以传入ZoneId来获得指定时区的日期
LocalDate today = LocalDate.now();
System.out.println(&today local date:&+today);
LocalDate firstDay_2014 = LocalDate.of(2014, Month.JANUARY,1);
System.out.println(firstDay_2014);
LocalDate todayKolkata = LocalDate.now(ZoneId.of(&Asia/Kolkata&));
System.out.println(todayKolkata);
2.&java.time.LocalTime:LocalTime是一个不可变的类,它的实例代表一个符合人类可读格式的时间,默认格式是hh:mm:ss.zzz。
像LocalDate一样,该类也提供了时区支持,同时也可以传入小时、分钟和秒等输入参数创建实例。
LocalTime time = LocalTime.now();
System.out.println(time);
LocalTime specifileTime = LocalTime.of(12,20,25);
System.out.println(specifileTime);
3.&&java.time.LocalDateTime:LocalDateTime是一个不可变的日期-时间对象,它表示一组日期-时间,
默认格式是yyyy-MM-dd-HH-mm-ss.zzz。它提供了一个工厂方法,接收LocalDate和LocalTime输入参数,创建LocalDateTime实例。
LocalDateTime today1 = LocalDateTime.now();
System.out.println(today1);
today1 = LocalDateTime.of(LocalDate.now(),LocalTime.now());
System.out.println(today1);
today1 = LocalDateTime.of(2017,Month.JANUARY,1,10,11,12);
System.out.println(today1);
4.&java.time.Instant:Instant类是用在机器可读的时间格式上的,它以Unix时间戳的形式存储日期时间.
Instant timestamp = Instant.now();
System.out.println(timestamp);//T01:21:10.598Z
5.日期API工具:提供了类似于加/减、天数、周数、月份数等,可以通过TemporalAdjuster调整日期,并计算两个日期间的周期。
LocalDate to = LocalDate.now();
System.out.println(&10 days after will be&+to.plusDays(10));
System.out.println(&3 weeks after will be&+to.plusWeeks(3));
System.out.println(&3 months after will be&+to.plusMonths(3));6. 解析与格式化:将一个日期格式转换为不同的格式,之后再解析一个字符串,得到日期对象。
LocalDate date = LocalDate.now();
System.out.println(date.format(DateTimeFormatter.ofPattern(&d-MM-uuuu&)));
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern(&d-MM-uuuu HH:mm:ss&)));
上面我们可以将一个LocalDateTime转换成一个字符串;
LocalDateTime dt = LocalDateTime.parse(& 09:09:11&,
DateTimeFormatter.ofPattern(&yyyy-MM-d HH:mm:ss&));
System.out.println(&Default format after parsing = &+dt);可以将一个字符串转换成一个LocalDateTime格式
将一个字符串转换成java.util.Date里面的对象在JAVA8里面的方法如下:
LocalDateTime dt = LocalDateTime.parse(& 09:09:11&,
DateTimeFormatter.ofPattern(&yyyy-MM-d HH:mm:ss&));
System.out.println(&Default format after parsing = &+dt);
Date str = Date.from(dt.atZone(ZoneId.systemDefault())
.toInstant());
System.out.println(str);
时间操作完之后再返回一个Date格式类型
Date.from(LocalDateTime.now().plusMinutes(executeTimes.intValue()
* executeTimes.intValue()).atZone(ZoneId.systemDefault()).toInstant())
旧的日期时间支持:旧的日期/时间类已经在几乎所有的应用程序中使用,因此做到向下兼容是必须的。
这也是为什么会有若干工具方法帮助我们将旧的类转换为新的类,反之亦然
mysql里面的jdbc类型与这些类型的对应关系
实体Entity里面,可以使用.sql.Date、java.sql.Timestamp、java.util.Date来映射到的date、timestamp、datetime等字段
如果想要在JDBC中,使用Java8的日期LocalDate、LocalDateTime,则必须要求数据库驱动的版本不能低于4.2。
结论:目前数据库里面暂时还是保留使用java.util.Date来操作吧。数据库里面的字段类型采用的还是datetime类型来定义吧
如何转换unixtimestamp与LocalDateTime之间互转
如何实现Date转unixtimestamp
常见代码示例:
<span style="color:#、比较两个日期是否相等
LocalDate today2 = LocalDate.now();
LocalDate date1 = LocalDate.of(2017, 8, 17);
System.out.println(date1.equals(today2));2、两个日期哪个在前哪个在后
LocalDate today2 = LocalDate.now();
LocalDate date1 = LocalDate.of(2017, 8, 18);
System.out.println(date1.isAfter(today2));3、获取当前日期的时间戳
Date str = Date.from(dt.atZone(ZoneId.systemDefault())
.toInstant());
System.out.println(dt.atZone(ZoneId.systemDefault()).toInstant());时间戳信息里同时包含了日期和时间,这和java.util.Date很像。实际上Instant类确实等同于 Java 8之前的Date类,
你可以使用Date类和Instant类各自的转换方法互相转换,例如:Date.from(Instant) 将Instant转换成java.util.Date,
Date.toInstant()则是将Date类转换成Instant类。
4、将日期转成字符串
LocalDate date = LocalDate.now();
System.out.println(date.format(DateTimeFormatter.ofPattern(&yyyy-MM-dd&)));5、与Date互转
//Date与Instant的相互转化
Instant instant
= Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();
//Date转为LocalDateTime
Date date2 = new Date();
LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());
//LocalDateTime转Date
LocalDateTime localDateTime3 = LocalDateTime.now();
Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();
Date date3 = Date.from(instant);
//LocalDate转Date
//因为LocalDate不包含时间,所以转Date时,会默认转为当天的起始时间,00:00:00
LocalDate localDate4 = LocalDate.now();
Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date date4 = Date.from(instant);
6、与时间戳之间的互转操作(long时间&#20540;)
long milliseconds = 0L;
LocalDateTime cvDate =
Instant.ofEpochMilli(milliseconds).atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(cvDate);
##可以从LocalTime转成Timestamp类型
LocalTime currentTime = LocalTime.of(LocalTime.now().getHour(), LocalTime.now().getMinute(), 0);
LocalDateTime dateTime = LocalDateTime.of(LocalDate.now(), currentTime);
Timestamp.valueOf(dateTime).getTime();
将long与LocalDate互转
milliseconds = 7L;
LocalDate date12 =
Instant.ofEpochMilli(milliseconds).atZone(ZoneId.systemDefault()).toLocalDate();
将LocalDateTime转long的数据
LocalDateTime localDT = LocalDateTime.of(2017, 02, 11, 8, 45, 50);long localDTInMilli = localDT.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
将LocalDate转long的数据
LocalDate localDate = LocalDate.of(2017, 02, 11);ZoneId zoneId = ZoneId.systemDefault();long localDdateInMilli = localDate.atStartOfDay(zoneId).toEpochSecond();
本文已收录于以下专栏:
相关文章推荐
Java原本提供了Data和Calendar用于处理日期、时间的类,包括创建日期、时间对象,获取系统当前日期、时间等操作。但Date不仅无法实现国际化,而且它对不同属性也使用了前后矛盾的偏移量,比如月...
日期时间API
1.Java8之前java.util.Date和Calendar类的弊端
2.简述 新的日期时间API
3.Java 新旧日期API的区别
4.java.time包下的类
5.新日期时...
java.util.Date & Calendar
Java对日期进行加减运算,年份加减,月份加减。日期的操作用Calendar,表示用Date。
import java.text.SimpleDat...
原文出处:oschina-成熟的毛毛虫
Java为何需要Lambda
Lambda的应用场景
Lambda的性能
Lambda的阴暗面
总结Java 8已经推出一段时间了,越来越多开发人员选择升级JD...
Java 8已经推出一段时间了,越来越多开发人员选择升级JDK,这条热门动弹里面看出,JDK7最多,其次是6和8,这是好事!在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了...
本文最早发布于deepinmind
在Java 8里面,java.util.Random经过改进后增加了一个实用的功能,可以返回一个随机数的流。
比如,如果要生成[0, 1)之间的随机浮点数的...
昨天在公司遇到一个小问题,需要计算两个日期之间相差的天数,于是首先想到的就是老API中的写法:后来觉得都有java8 还这样用是不是有点out了,于是就去翻time包中的方法,看到一个方法,这个方法是...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)跟上 Java 8 &#8211; 日期和时间实用技巧 - ImportNew
当你开始使用Java操作日期和时间的时候,会有一些棘手。你也许会通过System.currentTimeMillis() 来返回日到今天的毫秒数。或者使用Date类来操作日期;当遇到加减月份、天数的时候 你又需要用到Calendar类;当需要格式化日期的时候需要使用java.text.DateFormat类。 总而言之在Java中操作日期不是很方便,以至于很多开发者不得不使用第三方库,比如: joda-time。
现有API存在的问题
线程安全: Date和Calendar不是线程安全的,你需要编写额外的代码处理线程安全问题
API设计和易用性: 由于Date和Calendar的设计不当你无法完成日常的日期操作
ZonedDate和Time: 你必须编写额外的逻辑处理时区和那些旧的逻辑
好在JSR 310规范中为Java8添加了新的API, 在java.time包中,新的API纠正了过去的缺陷,
新的日期API
ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
Instant: 用来表示时间线上的一个点
LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
Clock: 用于访问当前时刻、日期、时间,用到时区
Duration: 用秒和纳秒表示时间的数量
最常用的就是LocalDate、LocalTime、LocalDateTime了,从它们的名字就可以看出是操作日期 和时间的。这些类是主要用于当时区不需要显式地指定的上下文。在本章节中我们将讨论最常用的api。
LocalDate代表一个IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。 获取当前的日期:
LocalDate localDate = LocalDate.now();
System.out.println(&localDate: & + localDate);
localDate:
LocalDate可以指定特定的日期,调用of或parse方法返回该实例:
LocalDate.of();
LocalDate.parse(&&);
当然它还有一些其他方法,我们一起来看看:
为今天添加一天,也就是获取明天
LocalDate tomorrow = LocalDate.now().plusDays(1);
从今天减去一个月
LocalDate prevMonth = LocalDate.now().minus(1, ChronoUnit.MONTHS);
下面写两个例子,分别解析日期 ,获取每周中的星期和每月中的日:
DayOfWeek thursday = LocalDate.parse(&&).getDayOfWeek();
System.out.println(&周四: & + thursday);
int twenty = LocalDate.parse(&&).getDayOfMonth();
System.out.println(&twenty: & + twenty);
试试今年是不是闰年:
boolean leapYear = LocalDate.now().isLeapYear();
System.out.println(&是否闰年: & + leapYear);
判断是否在日期之前或之后:
boolean notBefore = LocalDate.parse(&&)
.isBefore(LocalDate.parse(&&));
System.out.println(&notBefore: & + notBefore);
boolean isAfter = LocalDate.parse(&&).isAfter(LocalDate.parse(&&));
System.out.println(&isAfter: & + isAfter);
获取这个月的第一天:
LocalDate firstDayOfMonth = LocalDate.parse(&&)
.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(&这个月的第一天: & + firstDayOfMonth);
firstDayOfMonth = firstDayOfMonth.withDayOfMonth(1);
System.out.println(&这个月的第一天: & + firstDayOfMonth);
判断今天是否是我的生日,例如我的生日是
LocalDate birthday = LocalDate.of();
MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay today = MonthDay.from(LocalDate.now());
System.out.println(&今天是否是我的生日: & + today.equals(birthdayMd));
LocalTime表示一个时间,而不是日期,下面介绍一下它的使用方法。
获取现在的时间,输出15:01:22.144
LocalTime now = LocalTime.now();
System.out.println(&现在的时间: & + now);
将一个字符串时间解析为LocalTime,输出15:02
LocalTime nowTime = LocalTime.parse(&15:02&);
System.out.println(&时间是: & + nowTime);
使用静态方法of创建一个时间
LocalTime nowTime = LocalTime.of(15, 02);
System.out.println(&时间是: & + nowTime);
使用解析字符串的方式并添加一小时,输出16:02
LocalTime nextHour = LocalTime.parse(&15:02&).plus(1, ChronoUnit.HOURS);
System.out.println(&下一个小时: & + nextHour);
获取时间的小时、分钟
int hour = LocalTime.parse(&15:02&).getHour();
System.out.println(&小时: & + hour);
int minute = LocalTime.parse(&15:02&).getMinute();
System.out.println(&分钟: & + minute);
我们也可以通过之前类似的API检查一个时间是否在另一个时间之前、之后
boolean isBefore = LocalTime.parse(&15:02&).isBefore(LocalTime.parse(&16:02&));
boolean isAfter = LocalTime.parse(&15:02&).isAfter(LocalTime.parse(&16:02&));
System.out.println(&isBefore: & + isBefore);
System.out.println(&isAfter: & + isAfter);
输出 isBefore: true, isAfter: false。
在LocalTime类中也将每天的开始和结束作为常量供我们使用:
System.out.println(LocalTime.MAX);
System.out.println(LocalTime.MIN);
LocalTime就这些了,下面我们来了解一下LocalDateTime
LocalDateTime
LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
获取当前的日期和时间:
LocalDateTime now = LocalDateTime.now();
System.out.println(&现在: & + now);
现在: T15:17:19.926
下面使用静态方法和字符串的方式分别创建LocalDateTime对象
LocalDateTime.of(2017, Month.JULY, 20, 15, 18);
LocalDateTime.parse(&T15:18:00&);
同时`LocalDateTime`也提供了相关API来对日期和时间进行增减操作:
LocalDateTime tomorrow = now.plusDays(1);
System.out.println(&明天的这个时间: & + tomorrow);
LocalDateTime minusTowHour = now.minusHours(2);
System.out.println(&两小时前: & + minusTowHour);
这个类也提供一系列的get方法来获取特定单位:
Month month = now.getMonth();
System.out.println(&当前月份: & + month);
日期格式化
在日常开发中我们用到最多的也许就是日期、时间的格式化了,那在Java8种该如何操作呢?
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(&yyyy-MM-dd HH:mm:ss&);
System.out.println(&默认格式化: & + now);
System.out.println(&自定义格式化: & + now.format(dateTimeFormatter));
LocalDateTime localDateTime = LocalDateTime.parse(& 15:27:44&, dateTimeFormatter);
System.out.println(&字符串转LocalDateTime: & + localDateTime);
也可以使用DateTimeFormatter的format方法将日期、时间格式化为字符串
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(&yyyy-MM-dd&);
String dateString = dateTimeFormatter.format(LocalDate.now());
System.out.println(&日期转字符串: & + dateString);
Period类用于修改给定日期或获得的两个日期之间的区别。
给初始化的日期添加5天:
LocalDate initialDate = LocalDate.parse(&&);
LocalDate finalDate = initialDate.plus(Period.ofDays(5));
System.out.println(&初始化日期: & + initialDate);
System.out.println(&加日期之后: & + finalDate);
周期API中提供给我们可以比较两个日期的差别,像下面这样获取差距天数:
long between = ChronoUnit.DAYS.between(initialDate, finalDate);
System.out.println(&差距天数: & + between);
上面的代码会返回5,当然你想获取两个日期相差多少小时也是简单的。
与遗留代码转换
在之前的代码中你可能出现了大量的Date类,如何将它转换为Java8种的时间类呢?
Date和Instant互相转换
Date date = Date.from(Instant.now());
Instant instant = date.toInstant();
Date转换为LocalDateTime
LocalDateTime localDateTime = LocalDateTime.from(new Date());
System.out.println(localDateTime);
LocalDateTime转Date
Date date =
Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
LocalDate转Date
Date date =
Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()
Hi,请到伯乐在线的小组发帖提问,支持微信登录。链接是: http://group.jobbole....
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 写了文章?看干货?去头条!
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 活跃 &#038; 专业的翻译小组
&#8211; 国内外的精选博客文章
&#8211; UI,网页,交互和用户体验
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Android技术分享
&#8211; 专注iOS技术分享
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2017 ImportNewJava 8中日期和时间的处理方法
作者:小猪夫
字体:[ ] 类型:转载 时间:
Java 8新增了LocalDate和LocalTime接口,接下来通过本文给大家介绍Java 8中日期和时间的处理方法,非常不错,感兴趣的朋友一起看下吧
Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。
java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。
java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。
java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java 8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。
新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。
看看新的LocalDate怎么用:
// 取当前日期:
LocalDate today = LocalDate.now(); // -&
// 根据年月日取日期,12月就是12:
LocalDate crischristmas = LocalDate.of(); // -&
// 根据字符串取:
LocalDate endOfFeb = LocalDate.parse(""); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
LocalDate.parse(""); // 无效日期无法通过:DateTimeParseException: Invalid date
日期转换经常遇到,比如:
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); //
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); //
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); //
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了
// 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:
LocalDate firstMondayOf2015 = LocalDate.parse("").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); //
LocalTime只包含时间,以前用java.util.Date怎么才能只表示时间呢?答案是,假装忽略日期。
LocalTime包含毫秒:
LocalTime now = LocalTime.now(); // 11:09:09.240
你可能想清除毫秒数:
LocalTime now = LocalTime.now().withNano(0)); // 11:09:09
构造时间也很简单:
LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00
时间也是按照ISO格式识别,但可以识别以下3种格式:
最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:
SQL -& Java
--------------------------
date -& LocalDate
time -& LocalTime
timestamp -& LocalDateTime
再也不会出现映射到java.util.Date其中日期或时间某些部分为0的情况了。
以上所述是小编给大家介绍的Java 8中日期和时间的处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 java8 日期处理 的文章

 

随机推荐