文档章节

Java 8 日期 示例

阿刚ABC
 阿刚ABC
发布于 10/18 22:48
字数 2856
阅读 9
收藏 0

Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需要一个更好的 API来满足社区中已经习惯了使用JodaTime API的人们。全新API的众多好处之一就是,明确了日期时间概念,例如:瞬时(instant)、 长短(duration)、日期、时间、时区和周期。同时继承了Joda库按人类语言和计算机各自解析的时间处理方式。不同于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。下面是新版API中java.time包里的一些关键类:

  • Instant:瞬时实例。
  • LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。
  • LocalTime:本地时间,不包含日期。
  • LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
  • ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。

新API还引入了ZoneOffSet和ZoneId类,使得解决时区问题更为简便。解析、格式化时间的DateTimeFormatter类也全部重新设 计

示例 1:当前日期、当前时间、当前日期时间

        //获取当前日期
        System.out.println("----LocalDate----");
        LocalDate today = LocalDate.now();
        System.out.println("当前日期: " + today);
        //获取当前时间
        System.out.println("----LocalTime----");
        LocalTime time = LocalTime.now();
        System.out.println("当前时间 : " + time);
        //获取当前日期及时间
        System.out.println("----LocalDateTime----");
        LocalDateTime todayTime = LocalDateTime.now();
        System.out.println("当前时间 : " + todayTime);

执行输出:

----LocalDate----
当前日期: 2018-10-18
----LocalTime----
当前时间 : 22:39:05.892
----LocalDateTime----
当前时间 : 2018-10-18T22:39:05.893

 

示例 2:年、月、日、时、分、秒

//获取当前日期
        System.out.println("----通过LocalDate获取年月日----");
        LocalDate today = LocalDate.now();
        System.out.println("当前日期: " + today);
        //获取当前日期年 月  日
        int year = today.getYear();
        int month = today.getMonthValue();
        int day = today.getDayOfMonth();
        System.out.println("当前年:"+year);
        System.out.println("当前月:"+month);
        System.out.println("当前日:"+day);
        System.out.println("当前周:"+today.getDayOfWeek());
        //获取当前时间
        System.out.println("----通过LocalTime获取时分秒----");
        LocalTime time = LocalTime.now();
        System.out.println("当前时间 : " + time);
        int hour=time.getHour();
        int minute=time.getMinute();
        int second=time.getSecond();
        int nano=time.getNano();
        System.out.println("当前时:"+hour);
        System.out.println("当前分:"+minute);
        System.out.println("当前秒:"+second);
        System.out.println("当前毫秒:"+nano);

        //获取当前日期及时间
        System.out.println("----通过LocalDateTime获取年月日时分秒----");
        LocalDateTime todayTime = LocalDateTime.now();
        System.out.println("当前时间 : " + todayTime);
        //获取当前日期年 月  日
        year = todayTime.getYear();
        month = todayTime.getMonthValue();
        day = todayTime.getDayOfMonth();
        System.out.println("当前年:"+year);
        System.out.println("当前月:"+month);
        System.out.println("当前日:"+day);
        System.out.println("当前周:"+todayTime.getDayOfWeek());
        hour=todayTime.getHour();
        minute=todayTime.getMinute();
        second=todayTime.getSecond();
        nano=todayTime.getNano();
        System.out.println("当前时:"+hour);
        System.out.println("当前分:"+minute);
        System.out.println("当前秒:"+second);
        System.out.println("当前毫秒:"+nano);

执行输出:

----通过LocalDate获取年月日----
当前日期: 2018-10-18
当前年:2018
当前月:10
当前日:18
当前周:THURSDAY
----通过LocalTime获取时分秒----
当前时间 : 22:42:27.823
当前时:22
当前分:42
当前秒:27
当前毫秒:823000000
----通过LocalDateTime获取年月日时分秒----
当前时间 : 2018-10-18T22:42:27.824
当前年:2018
当前月:10
当前日:18
当前周:THURSDAY
当前时:22
当前分:42
当前秒:27
当前毫秒:824000000

 

示例 3:开始、结束

        System.out.println("----开始及结束----");
        System.out.println("当天的开始时间:"+LocalDateTime.of(LocalDate.now(), LocalTime.MIN));
        System.out.println("当天的结束时间:"+LocalDateTime.of(LocalDate.now(), LocalTime.MAX));

        TemporalAdjuster FIRST_OF_WEEK =
                TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue()- DayOfWeek.MONDAY.getValue()));
        System.out.println("本周的开始日期:"+today.with(FIRST_OF_WEEK));
        TemporalAdjuster LAST_OF_WEEK =
                TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
        System.out.println("本周的结束日期:"+today.with(LAST_OF_WEEK));

        System.out.println("本月的开始日期:"+ today.with(TemporalAdjusters.firstDayOfMonth()));
        System.out.println("本月的结束日期:"+ today.with(TemporalAdjusters.lastDayOfMonth()));
        System.out.println("本月第三天日期:"+ today.withDayOfMonth(3));
        System.out.println("下一个月的开始日期:"+ today.with(TemporalAdjusters.firstDayOfNextMonth()));

        System.out.println("本年的开始日期:"+ today.with(TemporalAdjusters.firstDayOfYear()));
        System.out.println("本年的结束日期:"+ today.with(TemporalAdjusters.lastDayOfYear()));
        System.out.println("本年第三天日期:"+ today.withDayOfYear(3));
        System.out.println("下一个年的开始日期:"+ today.with(TemporalAdjusters.firstDayOfNextYear()));

执行输出:

----开始及结束----
当天的开始时间:2018-10-18T00:00
当天的结束时间:2018-10-18T23:59:59.999999999
本周的开始日期:2018-10-15
本周的结束日期:2018-10-21
本月的开始日期:2018-10-01
本月的结束日期:2018-10-31
本月第三天日期:2018-10-03
下一个月的开始日期:2018-11-01
本年的开始日期:2018-01-01
本年的结束日期:2018-12-31
本年第三天日期:2018-01-03
下一个年的开始日期:2019-01-01

 

示例 4:N之前,N之后

        System.out.println("----日期加,下面两组一样----");
        System.out.println("当前日期加 2 Years : " +  today.plus(2,ChronoUnit.YEARS));// adding two Years
        System.out.println("当前日期加 2 Months : " +  today.plus(2,ChronoUnit.MONTHS));// adding two Months
        System.out.println("当前日期加 2 Days : " +  today.plus(2,ChronoUnit.DAYS));// adding two Days
        System.out.println("当前日期加 2 weeks : " +  today.plus(2, ChronoUnit.WEEKS));// adding two weeks

        System.out.println("当前日期加 2 Years : " +  today.plusYears(2));// adding two Years
        System.out.println("当前日期加 2 Months : " +  today.plusMonths(2));// adding two Months
        System.out.println("当前日期加 2 Days : " +  today.plusDays(2));// adding two Days
        System.out.println("当前日期加 2 weeks : " +  today.plusWeeks(2));// adding two weeks

        System.out.println("----日期减,下面两组一样----");
        System.out.println("当前日期减 2 Years : " +  today.minus(2,ChronoUnit.YEARS));// minus two Years
        System.out.println("当前日期减 2 Months : " +  today.minus(2,ChronoUnit.MONTHS));// minus two Months
        System.out.println("当前日期减 2 Days : " + today.minus(2,ChronoUnit.DAYS));// minus two Days
        System.out.println("当前日期减 2 weeks : " + today.minus(2,ChronoUnit.WEEKS));// minus two Days

        System.out.println("当前日期减 2 Years : " +  today.plusYears(-2));// adding two Years
        System.out.println("当前日期减 2 Months : " +  today.plusMonths(-2));// adding two Months
        System.out.println("当前日期减 2 Days : " +  today.plusDays(-2));// adding two Days
        System.out.println("当前日期减 2 weeks : " + today.plusWeeks(-2));// minus two Days

        System.out.println("----时间减,下面两组一样----");
        System.out.println("当前时间加 2 hours : " +  time.plus(2,ChronoUnit.HOURS));// adding two Hours
        System.out.println("当前时间加 2 Minutes : " +  time.plus(2,ChronoUnit.MINUTES));// adding two Minutes
        System.out.println("当前时间加 2 hours : " + time.plus(2,ChronoUnit.SECONDS));// adding two Seconds
        System.out.println("当前时间加 2 hours : " +  time.plus(2,ChronoUnit.NANOS));// adding two Nanos

        System.out.println("当前时间加 2 hours : " +  time.plusHours(2));// adding two Hours
        System.out.println("当前时间加 2 Minutes : " +  time.plusMinutes(2));// adding two Minutes
        System.out.println("当前时间加 2 hours : " +  time.plusSeconds(2));// adding two Seconds
        System.out.println("当前时间加 2 hours : " +  time.plusNanos(2));// adding two Nanos


        System.out.println("----时间减,下面两组一样----");
        System.out.println("当前时间加 2 hours : " +  time.minus(2,ChronoUnit.HOURS));// adding two Hours
        System.out.println("当前时间加 2 Minutes : " +  time.minus(2,ChronoUnit.MINUTES));// adding two Minutes
        System.out.println("当前时间加 2 hours : " + time.minus(2,ChronoUnit.SECONDS));// adding two Seconds
        System.out.println("当前时间加 2 hours : " +  time.minus(2,ChronoUnit.NANOS));// adding two Nanos

        System.out.println("当前时间减 2 hours : " +  time.plusHours(-2));// minus two Hours
        System.out.println("当前时间减 2 Minutes : " +  time.plusMinutes(-2));// minus two Minutes
        System.out.println("当前时间减 2 hours : " +  time.plusSeconds(-2));// minus two Seconds
        System.out.println("当前时间减 2 hours : " +  time.plusNanos(-2));// minus two Nanos

执行输出:

----日期加,下面两组一样----
当前日期加 2 Years : 2020-10-18
当前日期加 2 Months : 2018-12-18
当前日期加 2 Days : 2018-10-20
当前日期加 2 weeks : 2018-11-01
当前日期加 2 Years : 2020-10-18
当前日期加 2 Months : 2018-12-18
当前日期加 2 Days : 2018-10-20
当前日期加 2 weeks : 2018-11-01
----日期减,下面两组一样----
当前日期减 2 Years : 2016-10-18
当前日期减 2 Months : 2018-08-18
当前日期减 2 Days : 2018-10-16
当前日期减 2 weeks : 2018-10-04
当前日期减 2 Years : 2016-10-18
当前日期减 2 Months : 2018-08-18
当前日期减 2 Days : 2018-10-16
当前日期减 2 weeks : 2018-10-04
----时间减,下面两组一样----
当前时间加 2 hours : 00:48:04.575
当前时间加 2 Minutes : 22:50:04.575
当前时间加 2 hours : 22:48:06.575
当前时间加 2 hours : 22:48:04.575000002
当前时间加 2 hours : 00:48:04.575
当前时间加 2 Minutes : 22:50:04.575
当前时间加 2 hours : 22:48:06.575
当前时间加 2 hours : 22:48:04.575000002
----时间减,下面两组一样----
当前时间加 2 hours : 20:48:04.575
当前时间加 2 Minutes : 22:46:04.575
当前时间加 2 hours : 22:48:02.575
当前时间加 2 hours : 22:48:04.574999998
当前时间减 2 hours : 20:48:04.575
当前时间减 2 Minutes : 22:46:04.575
当前时间减 2 hours : 22:48:02.575
当前时间减 2 hours : 22:48:04.574999998

示例 5:日期差、时间差

System.out.println("----LocalDate 计算 年月日差----");
        LocalDate startLocalDate = LocalDate.of(2018, 1,18);
        LocalDate endLocalDate = LocalDate.of(2018, 3, 14);
        System.out.println("开始日期:"+startLocalDate);
        System.out.println("结束日期:"+endLocalDate);
        System.out.println("年数差:"+(ChronoUnit.YEARS.between(startLocalDate, endLocalDate)));
        System.out.println("月数差:"+(ChronoUnit.MONTHS.between(startLocalDate, endLocalDate)));
        System.out.println("日数差:"+(ChronoUnit.DAYS.between(startLocalDate, endLocalDate)));
        Period p = Period.between(startLocalDate, endLocalDate);
        System.out.printf("差 : %d 年 %d 月 %d 日  %n", p.getYears(), p.getMonths(), p.getDays());

        System.out.println("----LocalTime 计算 毫秒分钟差----");
        LocalTime startLocalTime = LocalTime.of(10, 1,18,10);
        LocalTime endLocalTime = LocalTime.of(11, 3, 14,20);
        System.out.println("开始时间:"+startLocalTime);
        System.out.println("结束时间:"+endLocalTime);
        System.out.println("毫秒差 : " + Duration.between(startLocalTime, endLocalTime).toMillis());
        System.out.println("分钟差 : " + Duration.between(startLocalTime, endLocalTime).getSeconds());

        System.out.println("----LocalDateTime 计算 年月日毫秒分钟差----");
        LocalDateTime startLocalDateTime = LocalDateTime.of(startLocalDate,startLocalTime);
        LocalDateTime endLocalDateTime = LocalDateTime.of(endLocalDate,endLocalTime);
        System.out.println("开始时间:"+startLocalDateTime);
        System.out.println("结束时间:"+endLocalDateTime);
        System.out.println("年数差:"+(ChronoUnit.YEARS.between(startLocalDateTime, endLocalDateTime)));
        System.out.println("月数差:"+(ChronoUnit.MONTHS.between(startLocalDateTime, endLocalDateTime)));
        System.out.println("日数差:"+(ChronoUnit.DAYS.between(startLocalDateTime, endLocalDateTime)));
        System.out.println("毫秒差 : " + Duration.between(startLocalDateTime, endLocalDateTime).toMillis());
        System.out.println("分钟差 : " + Duration.between(startLocalDateTime, endLocalDateTime).getSeconds());

执行输出:

----LocalDate 计算 年月日差----
开始日期:2018-01-18
结束日期:2018-03-14
年数差:0
月数差:1
日数差:55
差 : 0 年 1 月 24 日  
----LocalTime 计算 毫秒分钟差----
开始时间:10:01:18.000000010
结束时间:11:03:14.000000020
毫秒差 : 3716000
分钟差 : 3716
----LocalDateTime 计算 年月日毫秒分钟差----
开始时间:2018-01-18T10:01:18.000000010
结束时间:2018-03-14T11:03:14.000000020
年数差:0
月数差:1
日数差:55
毫秒差 : 4755716000
分钟差 : 4755716

示例6:大小比较

   System.out.println("----LocalDate 时间比较----");
        LocalDate startLocalDate = LocalDate.of(2018, 1,18);
        LocalDate endLocalDate = LocalDate.of(2018, 3, 14);
        System.out.println("日期:"+startLocalDate+"是否在日期:"+endLocalDate+"之前"+startLocalDate.isBefore(endLocalDate));
        System.out.println("日期:"+startLocalDate+"是否在日期:"+endLocalDate+"之后"+startLocalDate.isAfter(endLocalDate));
        System.out.println("日期:"+startLocalDate+"是否日期:"+endLocalDate+"相等"+startLocalDate.equals(endLocalDate));
        
        System.out.println("----LocalTime 时间比较----");
        LocalTime startLocalTime = LocalTime.of(12, 1,18,10);
        LocalTime endLocalTime = LocalTime.of(11, 3, 14,20);
        System.out.println("日期:"+startLocalTime+"是否在日期:"+endLocalTime+"之前"+startLocalTime.isBefore(endLocalTime));
        System.out.println("日期:"+startLocalTime+"是否在日期:"+endLocalTime+"之后"+startLocalTime.isAfter(endLocalTime));
        System.out.println("日期:"+startLocalTime+"是否日期:"+endLocalTime+"相等"+startLocalTime.equals(endLocalTime));
//
        System.out.println("----LocalDateTime 时间比较----");
        LocalDateTime startLocalDateTime = LocalDateTime.of(2018, 1,18,12, 1,18);
        LocalDateTime endLocalDateTime = LocalDateTime.of(2018, 1,18,12, 1,18);
        System.out.println("日期:"+startLocalDateTime+"是否在日期:"+endLocalDateTime+"之前"+startLocalDateTime.isBefore(endLocalDateTime));
        System.out.println("日期:"+startLocalDateTime+"是否在日期:"+endLocalDateTime+"之后"+startLocalDateTime.isAfter(endLocalDateTime));
        System.out.println("日期:"+startLocalDateTime+"是否日期:"+endLocalDateTime+"相等"+startLocalDateTime.equals(endLocalDateTime));

执行输出:

----LocalDate 时间比较----
日期:2018-01-18是否在日期:2018-03-14之前true
日期:2018-01-18是否在日期:2018-03-14之后false
日期:2018-01-18是否日期:2018-03-14相等false
----LocalTime 时间比较----
日期:12:01:18.000000010是否在日期:11:03:14.000000020之前false
日期:12:01:18.000000010是否在日期:11:03:14.000000020之后true
日期:12:01:18.000000010是否日期:11:03:14.000000020相等false
----LocalDateTime 时间比较----
日期:2018-01-18T12:01:18是否在日期:2018-01-18T12:01:18之前false
日期:2018-01-18T12:01:18是否在日期:2018-01-18T12:01:18之后false
日期:2018-01-18T12:01:18是否日期:2018-01-18T12:01:18相等true

示例 7:LocalDateTime、Date、String 、long互转

Date

 System.out.println("-----Date转LocalDateTime-----");
        Instant instant = (new Date()).toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
        System.out.println("localDateTime:"+localDateTime);

        System.out.println("-----LocalDateTime转Date-----");
        zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = (LocalDateTime.now()).atZone(zoneId);
        Date date = Date.from(zdt.toInstant());
        System.out.println("data:"+date.toString());

执行输出:

-----Date转LocalDateTime-----
localDateTime:2018-10-18T23:28:44.454
-----LocalDateTime转Date-----
data:Thu Oct 18 23:28:44 CST 2018

String

        System.out.println("-----LocalDateTime转字符串-----");
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println((LocalDateTime.now()).format(formatter));


        System.out.println("-----字符串转LocalDateTime-----");
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(LocalDateTime.parse("2018-10-18 23:38:26", df));

执行输出:

-----LocalDateTime转字符串-----
2018-10-18 23:40:04
-----字符串转LocalDateTime-----
2018-10-18T23:38:26

 

long

        System.out.println("-----long转LocalDateTime-----");
        Instant instantLong = Instant.ofEpochMilli(System.currentTimeMillis());
        ZoneId zoneLong = ZoneId.systemDefault();
        System.out.println("data:"+ LocalDateTime.ofInstant(instantLong, zoneLong));

        System.out.println("-----LocalDateTime转long-----");
        zoneLong = ZoneId.systemDefault();
        instantLong = localDateTime.atZone(zoneLong).toInstant();
        System.out.println("data:"+ instantLong.toEpochMilli());

执行输出:

-----long转LocalDateTime-----
data:2018-10-18T23:40:04.868
-----LocalDateTime转long-----
data:1539877204860

 

© 著作权归作者所有

阿刚ABC
粉丝 32
博文 142
码字总数 109947
作品 0
济南
高级程序员
私信 提问
Java 8时间和日期API 20例

伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将...

黄梦巍
2015/06/19
0
0
Java 8新的时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的...

清尘V
2015/03/17
0
0
浅谈Java SE新版本发布线路图

Java SE 9发布于2017年09月22日,也就是从这个版本开始,Java版本遵循半年一个版本的更新速度,Oracle将每三年指定一个版本作为长期支持(LTS)版本。到目前为止,已经发布了Java SE 10和Jav...

韬声依旧在路上
09/30
0
0
java8中的时间处理0 - api介绍

Java 8 Date Time API是我们java开发一直寻找的时间处理工具。java从一开始设计的时间类就让人头疼,好在现在终于有了java8。 为什么我们需要这套API 只要是有这么几个理由: Java的日期和时...

davelet
02/22
0
0
fastjson对Date的处理

对日期的序列化: 一种方法是通过注解 Java代码 @JSONField (format="yyyy-MM-dd HH:mm:ss") public Date birthday; 另一种是通过SerializeConfig: Java代码 private static SerializeConf......

John-HZ
2015/02/05
0
2

没有更多内容

加载失败,请刷新页面

加载更多

并行执行器

工作中出现某些代码需要并行执行以提高程序运算速度的情况,所以写了一个小工具。 public class Main {public static void main(String[] args) {// 你可以通过注释下面的部分代码来探索...

wanxiangming
31分钟前
1
0
AI赋能一键自动检测:页面异常、控件异常、文本异常

摘要: 1.前言 闲鱼质量团队一直致力于交付高质量的app给用户,当前随着AI技术不断发展,TensorFlow大热,也给测试手段带来了更多种可能,本文接下来给大家介绍AI在闲鱼测试的一点实践:如何...

阿里云官方博客
39分钟前
3
0
Microsoft Remote Desktop For Mac

地址:https://rink.hockeyapp.net/apps/5e0c144289a51fca2d3bfa39ce7f2b06/ 解决国内App store不能下载的问题。

Cheuker
50分钟前
1
0
原地打印刷新(倒计时)

原地打印刷新(倒计时) 代码如下 from time import sleepfor i in reversed(range(1, 11)): print("\r倒计时:{}秒".format(i), end="") sleep(1)...

_Change_
今天
1
0
php,vue,vue-ssr 做出来的页面有什么区别?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由shirishiyue发表于云+社区专栏 目前我这边的web页面,都是采用php+smarty模板生成的,是一种比较早期的开发模式。好处是没...

腾讯云加社区
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部