来自:Java译站html
连接:http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.htmljava
英文:http://javarevisited.blogspot.sg/2015/03/20-examples-of-date-and-time-api-from-Java8.htmlapi
本文根据上述资料进行整理修改说明安全
java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。学习
java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类线程
●Instant——它表明的是时间戳3d
●LocalDate——不包含具体时间的日期,好比2014-01-14。它能够用来存储生日,周年记念日,入职日期等。orm
●LocalTime——它表明的是不含日期的时间htm
●LocalDateTime——它包含了日期及时间,不过仍是没有偏移信息或者说时区。blog
●ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
一、如何在java8中获取当天的日期
java8中有个叫LocalDate的类,能用来表示今天的日期。这个类与java.util.Date略有不一样,由于它只包含日期,没有时间。
能够看到,他建立了今天的日期却不包含时间信息,而且格式化了日期。
二、如何在java8中获取当前的年月日
LocalDate类中提供了一些很方便的方法能够用来提取年月日以及其余的日期属性,特别方便,只须要使用对应的getter方法就能够了,很是直观
三、在java8中如何获取某个特定的日期
经过另外一个方法,能够建立出任意一个日期,它接受年月日的参数,而后返回一个等价的LocalDate实例。在这个方法里,须要的日期你填写什么就是什么,不想以前的API中月份必须从0开始
四、在java8中检查两个日期是否相等
LocalDate重写了equals方法来进行日期的比较,以下所示:
五、在java8中如何检查重复事件,好比生日
在java中还有一个与时间日期相关的任务就是检查重复事件,好比每个月的帐单日
如何在java中判断是不是某个节日或者重复事件,使用MonthDay类。这个类由月日组合,不包含年信息,能够用来表明每一年重复出现的一些日期或其余组合。他和新的日期库中的其余类同样也都是不可变且线程安全的,而且它仍是一个值类(value class)。
经过列子能够看到MonthDay只存储了月日,对比两个日期的月日便可知道是否重复
六、如何在java8中获取当前时间
这个与第一个例子获取当前日期很是类似,这里用的是LocalTime类,默认的格式是hh:mm:ss:nnn
能够看到,这个时间是不包含日期的
七、如何增长时间里面的小时数
不少时候须要对时间进行操做,好比加一个小时来计算以后的时间,java8提供了更方便的方法 如plusHours,这些方法返回的是一个新的LocalTime实例的引用,由于LocalTime是不可变的
八、如何获取1周后的日期
这个与前一个获取2小时后的时间的例子很类似,这里咱们获取的是1周后的日期。LocalDate是用来表示无时间的日期,他又一个plus()方法能够用来增长日,星期,月,ChronoUnit则用来表示时间单位,LocalDate也是不可变的,所以任何修改操做都会返回一个新的实例
能够看到一周后的日期是什么,也能够用这个方法来增长一个月,一年,一小时,一分等等
九、一年先后的日期
在上个例子中咱们使用了LocalDate的plus()方法来给日期增长日周月,如今咱们用minus()方法来找出一年前的那天
十、在java8中使用时钟
java8自带了Clock类,能够用来获取某个时区下(因此对时区是敏感的)当前的瞬时时间、日期。用来代替System.currentTimelnMillis()与TimeZone.getDefault()方法
十一、在java中如何判断某个日期在另外一个日期的前面仍是后面
如何判断某个日期在另外一个日期的前面仍是后面或者相等,在java8中,LocalDate类中使用isBefore()、isAfter()、equals()方法来比较两个日期。若是调用方法的那个日期比给定的日期要早的话,isBefore()方法会返回true。equals()方法在前面的例子中已经说明了,这里就不举例了
能够看到java8中比较日期很是简单,再也不须要使用Calendar这样另外的类来完成相似的任务了
十二、在java8中处理不一样的时区
java8中不只将日期和时间进行了分离,同时还有时区。好比ZonId表明的是某个特定时区,ZonedDateTime表明带时区的时间,等同于之前的GregorianCalendar类。使用该类,能够将本地时间转换成另外一个时区中的对应时间。
注意:对应时区的文本能够直接手动填写,也能够调用定义好了的,手动填写的时候注意不可填错了,不然你会遇到下面的异常
1三、如何表示固定的日期,好比信用卡过时时间
正如MonthDay表示的是某个重复出现的日子,YearMonth是另一个组合,表明的是像信用卡还款日,按期存款到期日,options到期日这类的日期。你能够用这个类找出这个月有多少天,LengthOfMonth()这个方法返回的是这个YearMonth实例有多少天,这对于检查2月是否润2月颇有用
1四、如何在java8中检查闰年
LocalDate类由一个isLeapYear()方法来返回当前LocalDate对应的那年是不是闰年
1五、两个日期之间包含多少天,多少月
计算两个日期之间包含多少天、周、月、年。能够用java.time.Period类完成该功能。下面例子中将计算日期与未来的日期之间一共有几个月
1六、带时区的日期与时间
在java8中,可使用ZoneOffset来表明某个时区,可使用它的静态方法ZoneOffset.of()方法来获取对应的时区,只要得到了这个偏移量,就能够用这个偏移量和LocalDateTime建立一个新的OffsetDateTime
能够看到如今时间日期和时区关联上了,注意OffsetDateTime主要是用来给机器理解的,平时使用就用前面结束的ZoneDateTime类就能够了
1七、在java8中获取当前时间戳
java8获取时间戳特别简单。Instant类由一个静态的工厂方法now()能够返回当前时间戳
能够看到,当前时间戳是包含日期和时间的,与java.util.Date很相似,事实上Instant就是java8之前的Date,可使用这个两个类中的方法在这两个类型之间进行转换,好比Date.from(Instant)就是用来把Instant转换成java.util.date的,而Date。toInstant()就是将Date转换成Instant的
18,如何在java8中使用预约义的格式器来对日期进行解析/格式化
在java8以前,时间日期的格式化很是麻烦,常用SimpleDateFormat来进行格式化,可是SimpleDateFormat并非线程安全的。在java8中,引入了一个全新的线程安全的日期与时间格式器。而且预约义好了格式。好比,本例中使用的BASICISODATE格式会将20160414格式化成2016-04-14
在DateTimeFormatter中还有不少定义好的格式,有兴趣的能够本身去看一下
1九、如何在java中使用自定义的格式器来解析日期
在上例中,咱们使用了预置的时间日期格式器来解析日期字符串了,可是有时预置的不能知足的时候就须要咱们自定义日期格式器了,下面的例子中的日期格式是"MM dd yyyy".你能够给DateTimeFormatter的ofPattern静态方法()传入任何的模式,它会返回一个实例,这个模式的字面量与前例中是相同的。好比M表明月,m仍表明分,无效的模式会抛异常DateTimeParseException。
20、如何在java8中对日期进行格式化,转换成字符串
前面的两个例子中,咱们主要是对日期字符串来进行解析转换成日期,在这个例子咱们相反,是把日期转换成字符。这里咱们有个LocalDateTime类的实例,咱们要把他转换成一个格式化好的日期串,与前例相同的是,咱们仍须要制定模式串去建立一个DateTimeFormatter类的实例,但调用的是LocalDate.format()。这个方法会返回一个表明当前日期的字符串,对应的模式就是传入的DateTimeFormatter实例中定义好的。
通过上面的例子,咱们已经对java8的时间日期有了必定的了解,如今回顾一下
●它提供了javax.time.ZoneId用来处理时区。
●它提供了LocalDate与LocalTime类
●Java 8中新的时间与日期API中的全部类都是不可变且线程安全的,这与以前的Date与Calendar API中的刚好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的。
●新的时间与日期API中很重要的一点是它定义清楚了基本的时间与日期的概念,比方说,瞬时时间,持续时间,日期,时间,时区以及时间段。它们都是基于ISO日历体系的。
每一个Java开发人员都应该至少了解这套新的API中的这五个类:
●Instant 它表明的是时间戳,好比2016-04-14T14:20:13.592Z,这能够从java.time.Clock类中获取,像这样: Instant current = Clock.system(ZoneId.of("Asia/Tokyo")).instant();
●LocalDate 它表示的是不带时间的日期,好比2016-04-14。它能够用来存储生日,周年记念日,入职日期等。
●LocalTime - 它表示的是不带日期的时间
●LocalDateTime - 它包含了时间与日期,不过没有带时区的偏移量
●ZonedDateTime - 这是一个带时区的完整时间,它根据UTC/格林威治时间来进行时区调整
●这个库的主包是java.time,里面包含了表明日期,时间,瞬时以及持续时间的类。它有两个子package,一个是java.time.foramt,这个是什么用途就很明显了,还有一个是java.time.temporal,它能从更低层面对各个字段进行访问。
●时区指的是地球上共享同一标准时间的地区。每一个时区都有一个惟一标识符,同时还有一个地区/城市(Asia/Tokyo)的格式以及从格林威治时间开始的一个偏移时间。好比说,东京的偏移时间就是+09:00。
●OffsetDateTime类实际上包含了LocalDateTime与ZoneOffset。它用来表示一个包含格林威治时间偏移量(+/-小时:分,好比+06:00或者 -08:00)的完整的日期(年月日)及时间(时分秒,纳秒)。
●DateTimeFormatter类用于在Java中进行日期的格式化与解析。与SimpleDateFormat不一样,它是不可变且线程安全的,若是须要的话,能够赋值给一个静态变量。DateTimeFormatter类提供了许多预约义的格式器,你也能够自定义本身想要的格式。固然了,根据约定,它还有一个parse()方法是用于将字符串转换成日期的,若是转换期间出现任何错误,它会抛出DateTimeParseException异常。相似的,DateFormatter类也有一个用于格式化日期的format()方法,它出错的话则会抛出DateTimeException异常。
●再说一句,“MMM d yyyy”与“MMm dd yyyy”这两个日期格式也略有不一样,前者能识别出"Jan 2 2014"与"Jan 14 2014"这两个串,然后者若是传进来的是"Jan 2 2014"则会报错,由于它指望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的状况下,你得在前面补0,好比"Jan 2 2014"应该改成"Jan 02 2014"。
关于Java 8这个新的时间日期API就讲到这了。这几个简短的示例 对于理解这套新的API中的一些新增类已经足够了。咱们学习了如何建立与修改日期实例。咱们还了解了纯日期,日期加时间,日期加时区的区别,知道如何比较两个日期,如何找到某天到指定日期好比说下一个生日,周年记念日或者保险日还有多少天。咱们还学习了如何在Java 8中用线程安全的方式对日期进行解析及格式化,而无需再使用线程本地变量或者第三方库这种取巧的方式。新的API能胜任任何与时间日期相关的任务。