java8 时间类API

来源:互联网 发布:宠物商城源码 编辑:程序博客网 时间:2024/06/08 12:33

    • 前言
    • Instant
    • LocalDate
    • Clock
    • SystemnanoTime

前言

(未完待续)
推荐一篇系统学习的java8时间类文章
我这里会介绍java8 新API中常用个类怎么用 应该是所有博文中最详细的使用API
1. Instant 时间戳
2. LocalDate 日期类 不包含 时分秒 只有年月日
3. LocalTime 时间类 只包含 时分秒
4. LocalDateTime 包含以上
5. Clock 时钟
6. 纳秒 System.nanoTime

Instant

  1. 使用:
    注意:下列方法获取的时间戳和北京相差8个时区

    Instant instant = Instant.now();System.out.println(instant);//输出2016-12-04T12:37:51.995Z 和北京时间相差8个时区

    解决方法:

    Instant now2 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));

    plusMillis():增加时间戳时间 以毫秒为单位,也有增加纳秒和秒的方法
    minusNanos():增加时间戳时间 以纳秒为单位
    minusSeconds():增加时间戳时间 以秒为单位
    TimeUnit.HOURS.toMillis():将小时转化为毫秒

  2. 获取从1970 1月1日到现在的 毫秒

    Instant instant = Instant.now();//获取从1970 1月1日到现在的 毫秒System.out.println(instant.toEpochMilli());
  3. 比较时间戳谁在前谁在后

    Instant instant = Instant.now();//获得当前时间戳并且增加33毫秒Instant instant2 = Instant.now().plusMillis(33);//获得当前时间戳并且减少33毫秒Instant instant3 = Instant.now().minusMillis(33);//获取当前时间  这里应该和instant的时间戳一样Instant instant4 = Instant.now();//判断 instant 是否在目标时间之后这里应该是trueSystem.out.println(instant.isAfter(instant3));//判断 instant 是否在目标时间之前这里应该是trueSystem.out.println(instant.isBefore(instant2));//判断两个时间戳是否相等 返回trueSystem.out.println(instant.equals(instant4));
  4. 获得两个时间戳相差天数或小时等

    Instant instant = Instant.now();//获得当前时间戳并且增加24小时//TimeUnit.HOURS.toMillis(24)将小时转毫秒Instant instant3 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(24));//获取相差天数 这里为返回1long until = instant.until(instant3, ChronoUnit.DAYS);//获取相差 这里返回小时 返回24long until2 = instant.until(instant3, ChronoUnit.HOURS);//获取相差 这里返回 毫秒86400000  ChronoUnit还有其他的我就不举例了long until3 = instant.until(instant3, ChronoUnit.MILLIS);
  5. 时间戳时差偏移和对应年月份

    Instant instant = Instant.now();//偏移时区相差30小时OffsetDateTime atOffset = instant.atOffset(ZoneOffset.ofHours(1));//返回偏移的时间戳 !!!!!!!!!//!!!!!注意这里的时间戳是原来的instant //!!!!  atOffset.toInstant()==instantatOffset.toInstant();//获取年份atOffset.getYear();//获取月份atOffset.getMonth();//获取月份的第几天atOffset.getDayOfMonth();//获取星期中的第几天 atOffset.getDayOfWeek();//atOffset.getDayOfWeek().getValue() 对应周数的第几天//atOffset.getDayOfWeek()返回 英文星期几 比如 SUNDAY//获取在某个时差//UTC不做偏差ZoneId.of("Asia/Kolkata")ZonedDateTime atZone = instant.atZone(ZoneOffset.UTC);//亚洲印度ZonedDateTime atZone = instant.atZone(ZoneId.of("Asia/Kolkata"));//偏差一小时ZonedDateTime atZone2 = instant.atZone(ZoneOffset.ofHours(1));//获取时间和上面相同
  6. 创建自定义时间

    Instant instant =Instant.parse("2007-12-03T10:15:30.00Z");
  7. 获得从1970-1-1到现在偏移的时间戳

    //偏移1970-1-1 3000毫秒Instant.ofEpochMilli(3000);//偏移300秒Instant.ofEpochSecond(300);
  8. 获取时间戳中 今年的第一天 或者最后一天,本月第一天….等

    Instant now = Instant.now();ZonedDateTime atZone = now.atZone(ZoneOffset.UTC);//获取时间戳 中这个月的第一天的时间 如现在时间是2016 10 23-->>2016 10 1ZonedDateTime with = atZone.with(TemporalAdjusters.firstDayOfMonth());//获取时间戳 下个月的第一天的时间 如现在时间是2016 10 23  -->>2016 11 1ZonedDateTime with2 = atZone.with(TemporalAdjusters.firstDayOfNextMonth());//获取时间戳 下年的第一天 如现在时间是2016 10 23  -->>2017 1 1ZonedDateTime with3 = atZone.with(TemporalAdjusters.firstDayOfNextYear());//获取时间戳 今年第一天 如现在时间是2016 10 23  -->>2016 1 1ZonedDateTime with4 = atZone.with(TemporalAdjusters.firstDayOfYear());//获取这个这个月的第一个星期二ZonedDateTime with5 = atZone.with(TemporalAdjusters.firstInMonth(DayOfWeek.TUESDAY));//获取时间戳 本月最后一天  2016 12 23  -->>2016 12 31ZonedDateTime with6 = atZone.with(TemporalAdjusters.lastDayOfMonth());//......后面大家自行查看TemporalAdjusters
  9. 获取时间戳 转化为LocalDate 等

    Instant now = Instant.now();ZonedDateTime atZone = now.atZone(ZoneOffset.UTC);//转化LocalDateatZone.toLocalDate();LocalDate date = LocalDate.from(atZone);//LocalDateTimeatZone.toLocalDateTime();LocalDateTime.from(atZone);//LocalDateTimeatZone.toLocalDateTime();LocalDateTime.from(date);

LocalDate

其实LocalDate,LocalDateTime,LocalTime 很多方法和时间戳基本都一样 大家不妨自己试试
时间戳中有的方法这个类基本都有…

  1. 创建(时间戳的添加/减少多个小时/天数也有这里就不写了)

        //获取当前时间 已经是本地时间    LocalDate date = LocalDate.now();    //获取指定时间    LocalDate date2 = LocalDate.parse("2007-12-03");    //获取指定时间    LocalDate date3 = LocalDate.of(2007, 12, 3);    //获取 距离1970-1-1 后面的第三十天 1970-01-31    LocalDate date4 =LocalDate.ofEpochDay(30);    //获取 1112年的第12天的日期  1112-1-12    LocalDate date5 = LocalDate.ofYearDay(1112, 12);
  2. 判断闰年

    //获取当前时间 已经是本地时间LocalDate date = LocalDate.now();//判断闰年date.isLeapYear();
  3. 两个时间的比较相差天数等

    这里和时间戳的方法都一样 不过多了一个 我这里说明下

    //获取当前时间 已经是本地时间LocalDate date = LocalDate.now();//多加111天LocalDate plusDays = LocalDate.now().plusDays(111);//特有方法Period until = date.until(plusDays);//比较两个时间 的月数中天数的差值!!!!坑注意了//如2016.3,2 和2016.5.25 那么返回 3-25=-22until.getDays();//月份相减until.getMonths();//相差年数 就是直接拿年减去until.getYears();
  4. 指定小时分秒

    虽然这个类不能获取到 时分秒 但是可以指定一个然后返回LocalDateTime对象(有年月日和时分秒)

    //获取当前时间 已经是本地时间LocalDate date = LocalDate.now();LocalDateTime atTime = date.atTime(LocalTime.now());

Clock

  //时钟提供给我们用于访问某个特定 时区的 瞬时时间、日期 和 时间的。  Clock c1 = Clock.systemUTC(); //系统默认UTC时钟(当前瞬时时间 System.currentTimeMillis())   System.out.println(c1.millis()); //每次调用将返回当前瞬时时间(UTC)   Clock c2 = Clock.systemDefaultZone(); //系统默认时区时钟(当前瞬时时间)   Clock c31 = Clock.system(ZoneId.of("Europe/Paris")); //巴黎时区   System.out.println(c31.millis()); //每次调用将返回当前瞬时时间(UTC)   Clock c32 = Clock.system(ZoneId.of("Asia/Shanghai"));//上海时区   System.out.println(c32.millis());//每次调用将返回当前瞬时时间(UTC)   Clock c4 = Clock.fixed(Instant.now(), ZoneId.of("Asia/Shanghai"));//固定上海时区时钟   System.out.println(c4.millis());   System.out.println(c4.millis()); //不变 即时钟时钟在那一个点不动   Clock c5 = Clock.offset(c1, Duration.ofSeconds(2)); //相对于系统默认时钟两秒的时钟   System.out.println(c1.millis());   System.out.println(c5.millis());

System.nanoTime

获取当前的纳秒.System.currentTimeMillis获取的是毫秒

long start = System.nanoTime();long end = System.nanoTime();//TimeUnit.NANOSECONDS.toMillis纳秒变化为秒System.out.println("执行时间为"+TimeUnit.NANOSECONDS.toMillis(end-start)+"s");
1 0
原创粉丝点击