java8时间API
来源:互联网 发布:c语言教学视频小甲鱼 编辑:程序博客网 时间:2024/06/05 12:50
java的时间api一直是一个诟病,包括util和sql包下的Date类,以及text包下的Format类,以及Canlendar类。感觉乱七八糟,用起来总感觉不那么舒服。java8更新了新的时间API,在java.time包下,统一了时间api的用法,也很方便。下面我们简单了解一下新时间API的常用类和方法。
Clock
Clock时钟类,可以用此类来获取当前的毫秒数,使用millis方法。需要注意的是,Clock是像正常的时钟一样是时刻在变动的,也就是说不同时刻调用millis方法,返回的都是调用时刻的毫秒数,相当于调用的System.currentTimeMillis方法。所以可以用millis方法来替换currentTimeMillis的用法。如下所示:
Clock clock = Clock.systemDefaultZone();System.out.println(clock.millis());Thread.sleep(1000);System.out.println(clock.millis());
输出结果如下:
15063130858591506313086860
Instant
Instant表示特定的某个时刻,一经创建就确定下来了,不会再改变。通过调用toEpochMilli方法,也可以获得毫秒数。可以通过Clock类来获得一个当前的时刻,或者通过一个固定的毫秒数来获得一个特定时刻。实例如下:
Clock clock = Clock.systemDefaultZone();//当前时刻InstantInstant instant = Instant.now();System.out.println(instant.toEpochMilli());Thread.sleep(1000);//不会影响输出结果System.out.println(instant.toEpochMilli());//通过时钟创建当前时刻,虽然时钟对象是在之前创建,但它创建的Instant也是当前时刻instant = clock.instant();System.out.println(instant.toEpochMilli());//使用毫秒数构建Instantinstant = Instant.ofEpochMilli(1506310760160L);System.out.println(instant.toEpochMilli());
输出结果如下:
1506319591032150631959103215063195920321506310760160
LocalDate
表示一个日期,通常格式为year-month-day。通过此类我们可以获得一些和当天有关的日期属性,比如:day-of-year,day-of-week and week-of-year等。比如我们知道某人的生日为1988年07月06日,我们要获得一下出生那天是星期几,是一年中的第几个星期等信息,实例如下:
//当前日期LocalDate today = LocalDate.now();System.out.println(today);//格式化System.out.println(today.format(DateTimeFormatter.ofPattern("yyyyMMdd")));//由生日获得对象LocalDate birthday = LocalDate.parse("1988-07-06");System.out.println(birthday);//常用方法System.out.println("年份:"+birthday.getYear());System.out.println("月份:"+birthday.getMonthValue());System.out.println("日份:"+birthday.getDayOfMonth());System.out.println("一年中第几天:"+birthday.getDayOfYear());System.out.println("星期:"+birthday.getDayOfWeek());System.out.println("月份天数:"+birthday.lengthOfMonth());System.out.println("年份天数:"+birthday.lengthOfYear());System.out.println("是否闰年:"+birthday.isLeapYear());//日期比较System.out.println(today.isBefore(birthday));System.out.println(today.isAfter(birthday));System.out.println(today.isEqual(birthday));
输出结果如下:
2017-09-25201709251988-07-06年份:1988月份:7日份:6一年中第几天:188星期:WEDNESDAY月份天数:31年份天数:366是否闰年:truefalsetruefalse
LocalTime
表示一个时间,通常格式为:hour-minute-second.可以获得当前时分秒等属性。实例如下:
//当前时间LocalTime now = LocalTime.now();System.out.println(now);//格式化System.out.println(now.format(DateTimeFormatter.ofPattern("HH:mm:ss")));//常用方法System.out.println("时:"+now.getHour());System.out.println("分:"+now.getMinute());System.out.println("秒:"+now.getSecond());System.out.println("纳秒:"+now.getNano());System.out.println("当天所经过的秒数:"+now.toSecondOfDay());System.out.println("当天所经过的纳秒数:"+now.toNanoOfDay());//时间比较LocalTime time = LocalTime.parse("05:01:01");System.out.println(time.isAfter(now));System.out.println(time.isBefore(now));
输出结果如下:
15:20:00.51815:20:00时:15分:20秒:0纳秒:518000000当天所经过的秒数:55200当天所经过的纳秒数:55200518000000falsetrue
LocalDateTime
LocalDateTime是LocalDate和LocalTime的整合体,表示日期和时间。通常格式为:year-month-day-hour-minute-second。包含了LocalDate和LocalTime的常用方法,并且可以相互转换。实例代码如下:
//当前时间LocalDateTime dateTime = LocalDateTime.now();System.out.println(dateTime);//格式化System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));//LocalDate转化为LocalDateTimeLocalDate date = LocalDate.now();LocalDateTime startOfDay = date.atStartOfDay();System.out.println("start of day:"+startOfDay);LocalDateTime atTime = date.atTime(LocalTime.parse("04:03:39"));System.out.println("localDate at time:"+atTime);//LocalTime转化为LocalDateTimeLocalTime time = LocalTime.parse("04:03:39");LocalDateTime atDate = time.atDate(date);System.out.println("localTime at date:"+atDate);//LocalDateTime转化为LoalDate和LocalTimeSystem.out.println("localDateTime toLocalDate:"+dateTime.toLocalDate());System.out.println("localDateTime toLocalTime:"+dateTime.toLocalTime());//LocalDateTime的常用方法System.out.println("年份:"+dateTime.getYear());System.out.println("月份:"+dateTime.getMonthValue());System.out.println("日份:"+dateTime.getDayOfMonth());System.out.println("一年中第几天:"+dateTime.getDayOfYear());System.out.println("星期:"+dateTime.getDayOfWeek());System.out.println("时:"+dateTime.getHour());System.out.println("分:"+dateTime.getMinute());System.out.println("秒:"+dateTime.getSecond());System.out.println("纳秒:"+dateTime.getNano());
Duration
Duration用来表示两个日期之间的间隔(单位分钟)。可计算LocalDateTime,LocalTime和Instant表示的时间之间的间隔。值得注意的LocalDate不在其行列,因为LocalDate并没有精确到分钟,所以没有办法计算。实例代码如下:
//LocalDateTimeDateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime datetime1 = LocalDateTime.parse("2017-01-01 08:12:02",ofPattern);LocalDateTime datetime2 = LocalDateTime.parse("2017-02-01 08:12:02",ofPattern);Duration between = Duration.between(datetime1, datetime2);System.out.println("间隔分钟:"+between.getSeconds());//LocalTimeDateTimeFormatter ofPattern1 = DateTimeFormatter.ofPattern("HH:mm:ss");LocalTime time1 = LocalTime.parse("08:12:02",ofPattern1);LocalTime time2 = LocalTime.parse("08:15:02",ofPattern1);between = Duration.between(time1, time2);System.out.println("间隔分钟:"+between.getSeconds());//InstantInstant instant2 = Instant.now();Instant instant1 = Instant.ofEpochMilli(1506225869099L);between = Duration.between(instant1, instant2);System.out.println("间隔分钟:"+between.getSeconds());
输出结果如下:
间隔分钟:2678400间隔分钟:180间隔分钟:100295
日期运算
各个日期类都可以通过plus和minus函数进行加减操作,代码如下所示:
LocalDate date = LocalDate.now();System.out.println("现在日期:"+date);System.out.println("加1天:"+date.plusDays(1));System.out.println("加2月星期:"+date.plusMonths(2));System.out.println("加23:"+date.plusWeeks(23));System.out.println("加2年:"+date.plusYears(2));System.out.println("减1天:"+date.minusDays(1));System.out.println("减2月星期:"+date.minusMonths(2));System.out.println("减23:"+date.minusWeeks(23));System.out.println("减2年:"+date.minusYears(2));LocalTime now = LocalTime.now();System.out.println("现在时间:"+now);System.out.println("加1小时:"+now.plusHours(1));System.out.println("加10分钟:"+now.plusMinutes(10));System.out.println("减1小时:"+now.minusHours(1));System.out.println("减10分钟:"+now.minusMinutes(10));LocalDateTime dateTime = LocalDateTime.now();System.out.println("现在日期:"+dateTime);System.out.println("加1天:"+dateTime.plusDays(1));System.out.println("加2月星期:"+dateTime.plusMonths(2));System.out.println("加23:"+dateTime.plusWeeks(23));System.out.println("加2年:"+dateTime.plusYears(2));System.out.println("减1天:"+dateTime.minusDays(1));System.out.println("减2月星期:"+dateTime.minusMonths(2));System.out.println("减23:"+dateTime.minusWeeks(23));System.out.println("减2年:"+dateTime.minusYears(2));System.out.println("加1小时:"+dateTime.plusHours(1));System.out.println("加10分钟:"+dateTime.plusMinutes(10));System.out.println("减1小时:"+dateTime.minusHours(1));System.out.println("减10分钟:"+dateTime.minusMinutes(10));Instant instant = Instant.now();System.out.println("现在日期:"+instant);System.out.println("加10万毫秒"+instant.plusMillis(100000));
输出结果如下:
现在日期:2017-09-25加1天:2017-09-26加2月星期:2017-11-25加23:2018-03-05加2年:2019-09-25减1天:2017-09-24减2月星期:2017-07-25减23:2017-04-17减2年:2015-09-25现在时间:16:05:10.295加1小时:17:05:10.295加10分钟:16:15:10.295减1小时:15:05:10.295减10分钟:15:55:10.295现在日期:2017-09-25T16:05:10.295加1天:2017-09-26T16:05:10.295加2月星期:2017-11-25T16:05:10.295加23:2018-03-05T16:05:10.295加2年:2019-09-25T16:05:10.295减1天:2017-09-24T16:05:10.295减2月星期:2017-07-25T16:05:10.295减23:2017-04-17T16:05:10.295减2年:2015-09-25T16:05:10.295加1小时:2017-09-25T17:05:10.295加10分钟:2017-09-25T16:15:10.295减1小时:2017-09-25T15:05:10.295减10分钟:2017-09-25T15:55:10.295现在日期:2017-09-25T08:05:10.297Z加10万毫秒2017-09-25T08:06:50.297Z
格式转换
对象和字符串以及毫秒之间的相互转化,代码如下所示:
//对象转字符串LocalDate date = LocalDate.now();String format = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));System.out.println(format);format = date.format(DateTimeFormatter.ofPattern("yyyyMMdd"));System.out.println(format);LocalTime time = LocalTime.now();format = time.format(DateTimeFormatter.ofPattern("HH:mm:ss"));System.out.println(format);format = time.format(DateTimeFormatter.ofPattern("HH-mm-ss"));System.out.println(format);LocalDateTime dateTime = LocalDateTime.now();format = dateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"));System.out.println(format);format = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss"));System.out.println(format);//字符串转对象date = LocalDate.parse("2017-01-01",DateTimeFormatter.ofPattern("yyyy-MM-dd"));System.out.println(date);time = LocalTime.parse("01-01-01", DateTimeFormatter.ofPattern("HH-mm-ss"));System.out.println(time);dateTime = LocalDateTime.parse("2017-01-01 01:01:01", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println(dateTime);//Instant 转化为毫秒Instant instant = Instant.now();System.out.println(instant.toEpochMilli());//毫秒 转化为 InstantSystem.out.println(Instant.ofEpochMilli(1506327309181L));//LocalDateTime转化为毫秒long millis = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();System.out.println(millis);//毫秒转化为LocalDateTimedateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(1506327309181L), ZoneId.systemDefault());System.out.println(dateTime);
输出结果如下:
2017-09-252017092516:17:2216-17-2220170925 16:17:222017-09-25 16-17-222017-01-0101:01:012017-01-01T01:01:0115063274424112017-09-25T08:15:09.181Z14832036610002017-09-25T16:15:09.181
工具类
使用新的API写的日期工具类,比较简单,抛砖引玉,各位大拿可自行添加工具方法。
import java.time.Instant;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.ZoneId;import java.time.format.DateTimeFormatter;/** * java 1.8时间api * * @author chuer * @date 2017年9月22日 上午11:19:03 */public class TimeUtil { public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static final DateTimeFormatter YYYY_MM_DD = DateTimeFormatter.ofPattern("yyyy-MM-dd"); public static final DateTimeFormatter HH_MM_SS = DateTimeFormatter.ofPattern("HH:mm:ss"); /** * @return 返回格式yyyy-MM-dd */ public static String date() { return LocalDate.now().format(YYYY_MM_DD); } /** * @return 返回当前年份 */ public static int year() { return LocalDate.now().getYear(); } /** * @return 返回当前月份 */ public static int month() { return LocalDate.now().getMonthValue(); } /** * @return 返回今日是月份中的第几天 */ public static int dayOfMonth() { return LocalDate.now().getDayOfMonth(); } /** * @return 返回今日是一年中的第几天 */ public static int dayOfYear() { return LocalDate.now().getDayOfYear(); } /** * @return 返回今日星期几 1-7 */ public static int dayOfWeek() { return LocalDate.now().getDayOfWeek().getValue(); } /** * @param year * @param month * @param day * @return 返回指定日期 */ public static String newDate(int year, int month, int day) { return LocalDate.of(year, month, day).toString(); } /** * @param year * 指定年份 * @param day * 指定年份中的天数 * @return 根据条件返回日期 */ public static String newDate(int year, int dayNum) { return LocalDate.ofYearDay(year, dayNum).toString(); } /** * @return 返回当前时间 HH:mm:ss.xxx */ public static String time() { return LocalTime.now().format(HH_MM_SS); } /** * @return 当前小时 */ public static int hour() { return LocalTime.now().getHour(); } /** * @return 当前分钟 */ public static int minute() { return LocalTime.now().getMinute(); } /** * @return 当前秒 */ public static int second() { return LocalTime.now().getSecond(); } /** * @return 返回格式 yyyy-MM-dd HH:mm:ss */ public static String dateTime() { return LocalDateTime.now().format(YYYY_MM_DD_HH_MM_SS); } /** * @param time * 从1970-01-01T00:00:00到现在的毫秒数 */ public static LocalDateTime parseDateTime(long time) { return LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault()); } /** * @param time * yyyy-MM-dd HH:mm:ss */ public static LocalDateTime parseDateTime(String time) { return LocalDateTime.parse(time, YYYY_MM_DD_HH_MM_SS); } /** * @param time * 从1970-01-01T00:00:00到现在的毫秒数 * @return */ public static LocalDate parseDate(long time) { return LocalDate.from(parseDateTime(time)); } /** * @param time * yyyy-MM-dd * @return */ public static LocalDate parseDate(String time) { return LocalDate.parse(time, YYYY_MM_DD); } /** * yyyy-MM-dd * * @param date * @return */ public static String format(LocalDate date) { return date.format(YYYY_MM_DD); } /** * @param dateTime * @return */ public static String format(LocalDateTime dateTime) { return dateTime.format(YYYY_MM_DD_HH_MM_SS); } /** * 转化为毫秒,默认为 * @param date * @return */ public static long millis(LocalDate date) { return millis(date.atStartOfDay()); } /** * 转化为毫秒 * @param dateTime * @return */ public static long millis(LocalDateTime dateTime) { return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); }}
- java8 时间类API
- java8时间API
- java8时间API
- java8的时间api
- Java8日期和时间API
- java8日期时间API(一)
- java8实战十一:java8----新的日期时间API
- Java8新特性——时间API
- java8 新的日期和时间api
- Java8:新的日期和时间API
- java8-03-全新的日期时间API
- java8 新的时期和时间API
- Java8 04 新日期时间API
- Java8之新时间日期API
- java8 时间
- Java8 日期/时间(Date Time)API指南
- Java8 日期/时间(Date Time)API指南
- Java8 日期/时间(Date Time)API指南
- [BZOJ4888][洛谷3760]异或和 树状数组
- 移动端页面上下滑动,大小、透明度的变化视觉差异效果切换页面
- 20170925
- IntentService源码解析
- 新的开始
- java8时间API
- python 模糊匹配
- 实例化需求:用户故事拆分的更好线索
- Java数据结构与算法之栈_动力节点Java学院整理
- 2017大学第七~九周学习笔记
- js 获取属性值
- java之环境变量
- Intellij Idea 2016.2 , PyCharm2016.2 激活码
- DES加密