Java Clock 详解

  • systemDefaultZone
  • millis
  • instant
  • offset
  • system
  • systemUTC
  • tick
  • tickMillis
  • tickSeconds
  • tickMinutes
  • fixed
  • withZone
  • getZone
  • equals
  • 参考文献

本页将介绍Java Clock的例子。

Clock属于java.time包。

ClockJava 8开始可用,Java 8不带纳秒,Java 9有纳秒,博主采用的Java 8 输出略有差异。例如:

2021-06-10T06:33:38.860249300Z //Java 9
2021-06-10T06:33:38.860Z //Java 8

Clock提供了使用时区和最佳可用系统时钟访问当前的瞬间、日期和时间。

我们可以使用Clock来代替使用System.currentTimeMillis()TimeZone.getDefault()方法。

Clock提供了不同的方法来获取当前的瞬时、日期和时间。

例如,instant()方法返回即时时间。

systemDefaultZone使用默认时区返回当前即时时间。

systemUTC()使用UTC时区返回当前即时时间。

system 给出指定时区的时钟。

offset 给出在添加了指定的持续时间后返回即时的时钟。

tick 给出返回瞬时的时钟,从指定的时钟截断到最接近指定持续时间的出现。

systemDefaultZone

systemDefaultZone 方法签名。

public static Clock systemDefaultZone()

systemDefaultZone 是一个静态方法,它让 Clock 使用默认时区返回当前时刻。

我们可以如下使用它。

Clock clock = Clock.systemDefaultZone();

我们可以使用ZoneId.systemDefault()Clock.system实现同样的行为,如下所示。

clock = Clock.system(ZoneId.systemDefault());

millis

millis方法的签名。

public long millis()

millis 返回从 1970-01-01T00:00Z (UTC) 到开始测量的时钟的当前毫秒时刻。

对于高性能用例,我们应该使用millis

millis 的值等价于 System.currentTimeMillis()

import java.time.Clock;public class MillisExample {public static void main(String[] args) {Clock clock = Clock.systemDefaultZone();System.out.println(clock.millis());}
}

输出

1623306818883

instant

Instant() 方法返回 Instant 对象。

Instant 是时间线上的一个瞬时点。

Instant() 返回由时钟定义的当前 Instant

import java.time.Clock;
import java.time.Instant;public class InstantExample {public static void main(String[] args) {Clock clock = Clock.systemDefaultZone();Instant instant = clock.instant();System.out.println(instant);}
}

输出

2021-06-10T06:33:38.860Z

offset

offset 方法的签名。

public static Clock offset(Clock baseClock, Duration offsetDuration)

offset静态方法提供一个时钟,该时钟从指定的基本时钟返回即时,并添加了指定的持续时间。

如果持续时间为负,则获得的时钟时刻将早于给定的基本时钟。

使用offset,我们可以获得给定基本时钟的过去和未来时刻。

如果我们传递零持续时间,那么我们将获得与给定基本时钟相同的时钟。

import java.time.Clock;
import java.time.Duration;public class OffsetExample {public static void main(String[] args) {Clock baseClock = Clock.systemDefaultZone();//Obtained clock will be later than baseClockClock clock = Clock.offset(baseClock, Duration.ofHours(120));System.out.println(clock.instant());//Obtained clock will be earlier than baseClock       clock = Clock.offset(baseClock, Duration.ofHours(-120));System.out.println(clock.instant());//Obtained clock will be same as baseClock         clock = Clock.offset(baseClock, Duration.ZERO);System.out.println(clock.instant());}
}

输出

2021-06-15T06:37:37.213Z
2021-06-05T06:37:37.250Z
2021-06-10T06:37:37.250Z

system

system 方法的签名。

public static Clock system(ZoneId zone)

system 是一个静态方法,它返回给定 ZoneIdClock 对象。

现在这个时钟对象将使用指定的时区给出当前时刻。

下面是区域编码为 Asia/Shanghaisystem 方法示例。

import java.time.Clock;
import java.time.ZoneId;public class SystemExample {public static void main(String[] args) {ZoneId zone = ZoneId.of("Asia/Shanghai");Clock c = Clock.system(zone);System.out.println(c.instant());ZonedDateTime zdt = c.instant().atZone(c.getZone());System.out.println("给定区域的日期时间是: " + zdt.toString());}
}

输出

2021-06-10T07:01:54.876Z
给定区域的日期时间是: 2021-06-10T15:01:54.901+08:00[Asia/Shanghai]

systemUTC

systemUTC() 返回使用 UTC 时区给出当前时刻的时钟。

import java.time.Clock;public class SystemUTCExample {public static void main(String[] args) {Clock clock = Clock.systemUTC();System.out.println(clock.instant());}
}

输出

2021-06-10T07:04:14.855Z

tick

tick 方法的签名。

public static Clock tick(Clock baseClock, Duration tickDuration)

tick返回使用指定基础时钟的时钟。

这个时钟将提供最接近于指定持续时间的时刻。

时钟持续时间必须是正数。

import java.time.Clock;
import java.time.Duration;public class TickExample {public static void main(String[] args) {Clock baseClock = Clock.systemDefaultZone();Clock clock = Clock.tick(baseClock, Duration.ofMillis(3));for(int i= 0; i < 5; i++) {System.out.println(clock.instant());try {Thread.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}}}
}

毫秒时间段相差必然是3 的乘积。

输出

2021-06-10T07:08:54.732Z
2021-06-10T07:08:54.762Z
2021-06-10T07:08:54.765Z
2021-06-10T07:08:54.768Z
2021-06-10T07:08:54.771Z

tickMillis

tickMillis 方法的签名。

public static Clock tickMillis(ZoneId zone)

这个方法是在Java 9中引入的,它返回给定时区的时钟。

这个时钟将以整毫秒为单位。

纳秒字段将被截断为毫秒。

tickMillis的功能也可以通过tick方法实现。

Clock clock = Clock.tickMillis(zoneId);

使用tick 可以实现相同的效果,如下所示。

Clock clock = Clock.tick(Clock.system(zoneId), Duration.ofMillis(1));

tickMillis 示例。

import java.time.Clock;
import java.time.ZoneId;public class TickMillisExample {public static void main(String[] args) {ZoneId zoneId = ZoneId.of("Asia/Shanghai");Clock clock = Clock.tickMillis(zoneId);for(int i= 0; i < 5; i++) {System.out.println(clock.instant());try {Thread.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}}}
}

输出

2021-06-10T07:16:35.726Z
2021-06-10T07:16:35.775Z
2021-06-10T07:16:35.780Z
2021-06-10T07:16:35.787Z
2021-06-10T07:16:35.790Z

tickSeconds

tickSeconds 方法的签名。

public static Clock tickSeconds(ZoneId zone)

tickSeconds给出了一个指定时区的时钟。

这个时钟将以整秒为单位返回当前瞬间的tickSeconds

纳秒字段将被设置为零。

tickSeconds的功能也可以通过tick方法实现。

找到使用tickSeconds的代码片段。

Clock clock = Clock.tickSeconds(zoneId);

使用tick 可以实现相同的效果,如下所示。

Clock clock = Clock.tick(Clock.system(zoneId), Duration.ofSeconds(1));

tickSeconds 示例。

import java.time.Clock;
import java.time.ZoneId;public class TickMillisExample {public static void main(String[] args) {ZoneId zoneId = ZoneId.of("Asia/Shanghai");Clock clock = Clock.tickSeconds(zoneId);for(int i= 0; i < 5; i++) {System.out.println(clock.instant());try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

输出

2021-06-10T07:21:17Z
2021-06-10T07:21:19Z
2021-06-10T07:21:21Z
2021-06-10T07:21:23Z
2021-06-10T07:21:25Z

tickMinutes

tickMinutes 方法的签名。

public static Clock tickMinutes(ZoneId zone)

tickMinutes 给出指定时区的时钟。

该时钟将在整分钟内立即返回。

Nano-of-secondsecond-of-minute 字段将设置为零。

我们将在整分钟内获得所有ticks

tickMinutes 的功能也可以通过 tick 方法来实现。

使用 tickMinutes 查找代码片段。

Clock clock = Clock.tickMinutes(zoneId);

使用tick 可以实现相同的效果,如下所示。

Clock clock = Clock.tick(Clock.system(zoneId), Duration.ofMinutes(1));

tickMinutes 示例。

import java.time.Clock;
import java.time.ZoneId;public class TickMinutesExample {public static void main(String[] args) {ZoneId zoneId = ZoneId.of("Asia/Shanghai");Clock clock = Clock.tickMinutes(zoneId);for(int i= 0; i < 3; i++) {System.out.println(clock.instant());try {Thread.sleep(90000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

输出

2021-06-10T07:26:00Z
2021-06-10T07:27:00Z
2021-06-10T07:28:00Z

fixed

fixed 方法的签名。

public static Clock fixed(Instant fixedInstant, ZoneId zone)

fixed 方法总是返回指定的相同时刻。

它在测试中很有用。 ZoneId 提供用于将即时转换为日期时间的时区。

查找示例示例以使用fixed 方法。

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;public class FixedExample {public static void main(String[] args) {Instant instant = Instant.parse("2021-06-08T15:16:17.00Z");ZoneId zoneId = ZoneId.of("Asia/Shanghai");Clock clock = Clock.fixed(instant, zoneId);System.out.println(clock.instant());}
}

输出

2021-06-08T15:16:17Z

withZone

withZone(ZoneId zone) 返回具有不同时区的时钟副本。

如果我们有一个时区的时钟实例,我们可以使用 withZone 方法为不同的时区制作该时钟的副本。

import java.time.Clock;
import java.time.ZoneId;public class WithZoneExample {public static void main(String[] args) {ZoneId zone1 = ZoneId.of("Asia/Aden");   Clock clock1 = Clock.system(zone1);  System.out.println(clock1.instant());ZoneId zone2 = ZoneId.of("America/Cuiaba"); Clock clock2 = clock1.withZone(zone2);System.out.println(clock2.instant());    }
}

输出

2021-06-10T07:35:06.110Z
2021-06-10T07:35:06.136Z

getZone

getZone() 给出用于创建日期和时间的时区。

import java.time.Clock;
import java.time.ZoneId;public class GetZoneExample {public static void main(String[] args) {Clock clock = Clock.systemDefaultZone();ZoneId zone = clock.getZone();System.out.println(zone.getId());}
}

输出

Asia/Shanghai

equals

equals 方法检查两个时钟是否相等。

import java.time.Clock;public class EqualsExample {public static void main(String[] args) {Clock clock = Clock.systemDefaultZone();System.out.println(clock.equals(Clock.systemDefaultZone()));System.out.println(clock.equals(Clock.systemUTC()));}
}

输出

true
false

参考文献

【1】Class Clock
【2】Java Clock

【Java 8 新特性】Java Clock 详解相关推荐

  1. java lambda表达式详解_Java8新特性Lambda表达式详解

    课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...

  2. 【java8新特性】——Optional详解(三)

    一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...

  3. H5的新特性及API详解(很惊人)

    H5的新特性及API详解(很惊人) 2017-01-20 17:00 4057人阅读 评论(0) 收藏 举报  分类: h5(11)  js函数(64)  js技巧(15)  版权声明:本文为博主原创 ...

  4. jdk8新特性 lambda表达式详解

    本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...

  5. Java8新特性Stream流详解

    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...

  6. 显微镜下的webpack4的新特性:mode详解

    webpack4支持的一个新特性就是zero配置,不需要config,也可以打包,这对于懒癌患者很有诱惑力,但是这也意味着我们不清楚零配置发生了写什么,也不知道打包出来的文件是否符合我们的心意,全部都 ...

  7. C++11中的一些新特性以及代码详解

    C++11新特性 auto decltype 追踪返回类型 类内成员初始化 列表初始化 基于范围的for循环 静态断言 noexcept修饰符 强类型枚举 常量表达式 原生字符串字面值 继承控制 fi ...

  8. C++11新特性——λ(lambda)表达式详解

    C++11新特性--λ(lambda)表达式 C++11中引入了λ表达式,它可以用来定义一个内联(inline)的函数,作为一个本地的对象或者一个参数.有了λ表达式,我们可以很方便的使用stl标准库. ...

  9. springboot 优雅停机_Spring Boot 2.3 新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestControllerpublic class DemoController { @GetMapping("/demo") pu ...

  10. JAVA8 Optional新特性和使用详解

    文章目录 一.Optional简介 二.应用Optional 1.创建Optional对象 2.Optional中map用法 3.Optional其它方法用法 三.Optional实战 1.创建Opt ...

最新文章

  1. CVPR 2020丨动态卷积:自适应调整卷积参数,显著提升模型表达能力
  2. selenium 实现网页截图
  3. Linux/Unix环境下的make和makefile详解
  4. Linux Capabilities 入门教程--进阶实战篇
  5. linux终端按下退格键自动覆盖上一行的问题
  6. js Date 生成某年某月的天数
  7. java swing 动态生成表格_6 个曾经牛逼哄哄的 Java 技术,你用过吗?
  8. i++与++i的区别
  9. 5 个 IDEA 必备插件,让效率成为习惯
  10. VS2010/MFC编程入门之四十四:定时器Timer
  11. 内心的秘密写在脸上,科学家用面部识别预测性取向和犯罪倾向
  12. Leetcode 199.二叉树的右视图
  13. matlab源码——政治优化算法(Political Optimizer,PO)
  14. 动态修改类注解(赋值)
  15. 如何查看Linux虚拟机ip地址
  16. 鸿蒙系统 微内核 sel4,微内核 seL4 Mapping
  17. 如何编写爬虫获取淘宝网上所有的商品分类以及关键属性 销售属性 非关键属性数据
  18. 批处理文件进行音频格式转换
  19. 【学习生涯】预科学习笔记
  20. 金融、股票、投行的常见术语及一些简单区分

热门文章

  1. ps制作普通文字步骤
  2. [专题总结]组合数学
  3. 用VBA生成word文档的准考证
  4. IP-GUARD导致微软OFFICE里Onedrive打不开加密和明文文件
  5. Redis入门完整教程:寻找热点key
  6. 拓扑排序入门(真的很简单)
  7. 本科、硕士、博士的区别是什么?
  8. GNU 是什么,和 Linux 是什么关系?
  9. PMP_蒙特卡洛分析_风险定量分析工具
  10. 【STL详解】string类