您的位置:首页 > 编程语言 > Java开发

LocalDate LocalTime LocalDateTime DateTimeFormatter Java 8 新出的时间(time)和日期(date)的API的使用详细实例

2017-12-27 10:53 1296 查看
现在有如下需求,根据传入时间
获得当前时间的凌晨零点零分零秒的时间,时间戳。
获得当前时间的本周一的凌晨零点零分零秒的时间,时间戳。
获得当前时间的本月的第一天的凌晨零点零分零秒的时间,时间戳。
新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。
使用Java 8 新提供的API可以很好的操作时间。
时间和日期,可以实现简单的加plus 减 minus。可以操作的跨度:年月日时分秒周纳秒。
可谓相当的全。

还有个需要注意的地方,他有很多方法都是对当前日期操作完之后,返回一个新的日期,是不会改变原来的日期的,所以,操作完的结果,你得弄个新对象来接收哟
这三个类,都跟String类一样,是final的,不能修改和继承的。
先是一个总的main方法。
/**
* 在新的Java 8中,日期和时间被明确划分为LocalDate和LocalTime,
* LocalDate无法包含时间;
* LocalTime无法包含日期;
* LocalDateTime才能同时包含日期和时间。
*/
private static void java8DateTest() {
localDateTest();
localTimeTest();
localDateTimeTest();
}


LocalDate /**
* jdk 1.8 中的 localDate 的使用
*/
private static void localDateTest() {
System.out.println("-----------test java 8 LocalDate-----------");
LocalDate today = LocalDate.now();
System.out.println("当前日期:" + today);
System.out.println("当前日期的年:" + today.getYear());
//返回的是枚举类型:Month,Java 8 新增的枚举类型
System.out.println("当前日期的月--枚举类型:" + today.getMonth());
//这个返回int才是我们常用的月的数字形式。
//记得以前你学Java的时候,一月的数字是0吗?这不用你自己手动+1啦,自动就是月份对应的数字,1-12.
System.out.println("当前日期的月--数字类型:" + today.getMonthValue());
System.out.println("当前日期的日:" + today.getDayOfMonth());
//返回的是枚举类型:DayOfWeek,Java 8 新增的枚举类型
System.out.println("当前日期是周几:" + today.getDayOfWeek());
System.out.println("当前日期是一年之中的第几天:" + today.getDayOfYear());
//Chronology:翻译为年代学;年表。此处的返回值是 ISO
System.out.println("年表:" + today.getChronology());

LocalDate christmas = LocalDate.of(2017, 12, 25);
System.out.println("christmas:" + christmas);
//严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
LocalDate endOfDec = LocalDate.parse("2017-12-28");
System.out.println("endOfDec:" + endOfDec);
/*
* 无效日期无法通过:DateTimeParseException: Invalid date
*/
//LocalDate.parse("2017-02-29");

System.out.println("当前日期:" + today);
LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("当前日期所在的月的第一天:" + firstDayOfMonth);
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("当前日期所在的月的最后一天:" + lastDayOfThisMonth);
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2);
System.out.println("当前日期所在的月的第二天:" + secondDayOfThisMonth);

//对日期进行加减 plus minus
System.out.println("当前日期plus一天:" + today.plusDays(1));
System.out.println("当前日期minus一天:" + today.minusDays(1));
}
下面是运行的结果的图。

就简单的看下运行结果。

LocalTime

/**
* jdk 1.8 中的 LocalTime 的使用
*/
private static void localTimeTest() {
System.out.println("-----------test java 8 LocalTime-----------");
LocalTime now = LocalTime.now();
System.out.println("当前时间" + now);
System.out.println("当前时间:小时--" + now.getHour());
System.out.println("当前时间:分钟--" + now.getMinute());
System.out.println("当前时间:秒--" + now.getSecond());
//纳秒,不是毫秒,是十亿分之一秒。
System.out.println("当前时间:纳秒--" + now.getNano());
//清除毫秒数,也就是说,你可以肆意设置时间的任意一个位置的值,使用withXXX()就可以啦。
System.out.println("当前时间:清空纳秒--" + now.withNano(0));
System.out.println("当前时间:挨个清零--" + now.withHour(0).withMinute(0).withSecond(0).withNano(0));
}运行结果如下。



LocalDateTime

/**
* jdk 1.8 中的 LocalDateTime 的使用
*/
private static void localDateTimeTest() {
System.out.println("-----------test java 8 LocalDateTime-----------");
//当前时间,以秒为单位。
long epochSecond = System.currentTimeMillis() / 1000L;
//默认使用系统时区
ZoneId zoneId = ZoneOffset.systemDefault();
//之所以这么初始化,是因为根据传入的时间进行操作
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), zoneId);
//LocalDateTime.now();//也可以这么获得当前时间
System.out.println("localDateTime 初始化值:" + localDateTime);
System.out.println("getYear:" + localDateTime.getYear());
//方法返回值类型特殊,是枚举类型:Month类型
System.out.println("getMonth:" + localDateTime.getMonth());
System.out.println("getDayOfMonth:" + localDateTime.getDayOfMonth());
System.out.println("getHour:" + localDateTime.getHour());
System.out.println("getMinute:" + localDateTime.getMinute());
System.out.println("getSecond:" + localDateTime.getSecond());
System.out.println("getNano:" + localDateTime.getNano());
System.out.println("getDayOfWeek:" + localDateTime.getDayOfWeek());

/*
* 获得传入时间的某一天的凌晨零分零秒的秒数
*/
long dayStart = localDateTime.withHour(0).withMinute(0).withSecond(0).atZone(zoneId).toEpochSecond();
System.out.println("dayStart 时间戳,秒数:" + dayStart);
/*
* 获得传入时间的周一的凌晨零分零秒的秒数
*/
localDateTime = LocalDateTime.of(2017, 12, 2, 0, 0, 0);
System.out.println("localDateTime 设置当前值:" + localDateTime);
System.out.println("getDayOfWeek:" + localDateTime.getDayOfWeek());
System.out.println("getDayOfWeek 的 ordinal 值:" + localDateTime.getDayOfWeek().ordinal());
LocalDateTime weekStart = localDateTime.minusDays(localDateTime.getDayOfWeek().ordinal()).withHour(0).withMinute(0).withSecond(0);
System.out.println("weekStart:" + weekStart);
/*
* 获得传入时间的月份的第一天的凌晨零分零秒的秒数
*/
long monthStart = localDateTime.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).atZone(zoneId).toEpochSecond();
System.out.println("monthStart 时间戳,秒数:" + monthStart);

/*
* 传入时间的年的第一天
*/
LocalDateTime firstDayOfYear = localDateTime.with(TemporalAdjusters.firstDayOfYear());
System.out.println("firstDayOfYear:" + firstDayOfYear);

/*
* 当前时间,往后推一周的时间。plus 加
*/
LocalDateTime plusWeeks = localDateTime.plusWeeks(1);
System.out.println("plus one week:" + plusWeeks);
/*
* 当前时间,向前推一周的时间。minus 减
*/
LocalDateTime minusWeeks = localDateTime.minusWeeks(1);
System.out.println("minus one week:" + minusWeeks);

DateTimeFormatter sf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
String startTime = "2016-11-13 23:59";
localDateTime = LocalDateTime.parse(startTime, sf);
System.out.println(localDateTime);
}

代码运行结果,如下:



讲真,这代码里面的星期,和所有的月,都变成了对应的枚举类型,枚举类型的用法要是有的观众不知道的话,可以参考下面的链接。
怎么才算你懂枚举呢?比如,上面说的 ordinal 属性,你知道这个是啥。不知道的,可以看看下面的链接。
Java 枚举(enum) 详解7种常见的用法

上面已经有不少实例啦,当然,肯定不全面,比如,不同的日期操作,有很多的初始化方法,我这也就实验了几个,没有全部实验。也有很多的方法,我也就简单的使用了一部分,具体源码里面,还是有很多我这没使用到的。老铁顺道点进去看看源码,大概就了解啦。
我要是以后有啥补充呢,也会继续完善这个文章的。

DateTimeFormatter

顺道再来个日期格式化的问题,配套的使用Java 8 里面的东西。
/**
* 日期格式化测试
*/
private static void dateTimeFormatterTest() {
/*
* 解析日期
*/
String dateStr = "2016年10月25日";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date = LocalDate.parse(dateStr, formatter);
System.out.println(date);

/*
* 日期转换为字符串
*/
LocalDateTime now = LocalDateTime.now();
System.out.println("未格式化时:" + now);
//HH 和 hh 的差别:前者是24小时制,后者是12小时制。
String formatString = "yyyy年MM月dd日 HH:mm:SS" +
" 上下午标志 a" +
" E" +
" 一年中的第D天" +
" 一月中的第F个星期" +
" 一年中的第w个星期" +
" 一月中的第W个星期";
DateTimeFormatter format = DateTimeFormatter.ofPattern(formatString);
System.out.println(now.format(format));
format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm a");
System.out.println(now.format(format));
format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm a");
System.out.println(now.format(format));
}运行结果:



暂时就这样
具体里面的特殊字母不懂啥意思的,参见下面的链接:
java 日期格式化-- SimpleDateFormat 的使用。字符串转日期,日期转字符串

嗯,也可以顺道回忆一下,以前是怎么格式化日期的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: