【Java 8 新特性】Java Clock offset() 给时钟添加指定持续时间

102 篇文章 72 订阅

Java Clock.offset获取一个时钟,从指定的时钟中返回添加了指定持续时间的实例。

如果持续时间为负数,则该时刻将比当前时刻早。

Clock.offset可以用来获得一个时钟,它将给出过去或未来的瞬间。

如果我们传递零持续时间,我们将得到基础时钟。

在Java文档中找到Clock.offset的方法声明。

public static Clock offset(Clock baseClock, Duration offsetDuration) 

其中,baseClock是将被添加或减去持续时间的时钟。

offsetDuration是添加或减去基本时钟的持续时间。

Clock.offset将返回以基础时钟为基础的、添加或减去持续时间的时钟。

持续时间为秒

在这里,我们将使用Clock.offset来获得过去和未来的时钟,持续时间由Duration.ofSeconds给出。

DurationSeconds.java

import java.time.Clock;
import java.time.Duration;
public class DurationSeconds {
  public static void main(String[] args) {
	Clock baseClock = Clock.systemDefaultZone();
	System.out.println(baseClock.instant());
	
	//Obtained clock will be ahead by 10 seconds to the baseClock. 
	Clock clock = Clock.offset(baseClock, Duration.ofSeconds(10));
	System.out.println(clock.instant());

	//Obtained clock will be earlier by 10 seconds to the baseClock.
	clock = Clock.offset(baseClock, Duration.ofSeconds(-10));
	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-13T07:34:37.020Z
2021-06-13T07:34:47.030Z
2021-06-13T07:34:27.030Z
2021-06-13T07:34:37.030Z

在上面的例子中,我们得到未来10秒的时钟和过去10秒的时钟。

我们还可以看到,当我们通过零持续时间时,我们得到了原始时间的时钟。

持续时间为分钟

这里我们将使用Clock.offset来获得过去和未来的时钟,其持续时间由Duration.ofMinutes给出。

DurationMinutes.java

import java.time.Clock;
import java.time.Duration;
public class DurationMinutes {
  public static void main(String[] args) {
	Clock baseClock = Clock.systemDefaultZone();
	System.out.println(baseClock.instant());

	// Obtained clock will be ahead by 15 minutes to the baseClock
	Clock clock = Clock.offset(baseClock, Duration.ofMinutes(15));
	System.out.println(clock.instant());

	// Obtained clock will be earlier by 15 minutes to the baseClock
	clock = Clock.offset(baseClock, Duration.ofMinutes(-15));
	System.out.println(clock.instant());
  }
} 

输出

2021-06-13T07:41:11.839Z
2021-06-13T07:56:11.848Z
2021-06-13T07:26:11.848Z

在上面的例子中,我们得到未来 15 分钟的时钟 和过去 15 分钟的时钟。

持续时间为小时

这里我们将使用Clock.offset来获得过去和未来的时钟,其持续时间由Duration.ofHours给出。

DurationHours.java

import java.time.Clock;
import java.time.Duration;
public class DurationHours {
  public static void main(String[] args) {
	Clock baseClock = Clock.systemDefaultZone();
	System.out.println(baseClock.instant());

	// Obtained clock will be ahead by 5 hours to the baseClock
	Clock clock = Clock.offset(baseClock, Duration.ofHours(5));
	System.out.println(clock.instant());

	// Obtained clock will be earlier by 5 hours to the baseClock
	clock = Clock.offset(baseClock, Duration.ofHours(-5));
	System.out.println(clock.instant());
  }
} 

输出

2021-06-13T07:43:18.267Z
2021-06-13T12:43:18.276Z
2021-06-13T02:43:18.276Z

在上面的例子中,我们得到了未来5小时的时钟和过去5小时的时钟。

持续时间为天

这里我们将使用Clock.offset来获得过去和未来的时钟,其持续时间由Duration.ofDays给出。

DurationDays.java

import java.time.Clock;
import java.time.Duration;
public class DurationDays {
  public static void main(String[] args) {
	Clock baseClock = Clock.systemDefaultZone();
	System.out.println(baseClock.instant());

	// Obtained clock will be ahead by 8 days to the baseClock
	Clock clock = Clock.offset(baseClock, Duration.ofDays(8));
	System.out.println(clock.instant());

	// Obtained clock will be earlier by 8 days to the baseClock
	clock = Clock.offset(baseClock, Duration.ofDays(-8));
	System.out.println(clock.instant());
  }
} 

输出

2021-06-13T07:45:07.420Z
2021-06-21T07:45:07.429Z
2021-06-05T07:45:07.429Z

在上面的例子中,我们得到未来8天的时钟和过去8天的时钟。

参考文献

【1】Java Doc: Class Clock
【2】Java Clock 详解
【3】Java Clock offset()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
本程式 (NTPClock) 之功能最主要是透过网路读取 NTP 时间伺服器之标準时间,於电脑萤幕上显示标準时间,并可立即更系统时鐘,以同步於标準时间。 程式主要外观说明 1.1. 具标题列及选单列之应用程式外观:若接上网路,所显示為标準时间而非个人电脑上之时间 1.2. 不具标题列及选单列之应用程式外观 请注意: 1.2.1. 左下角 N 代表前一次网路连线时网路及伺服器一切正常 1.2.2. 使用者可以滑鼠左键双击显示区域即可切换此两种显示模式 或是在"显示"选单(或是滑鼠右键选单)中可以勾选"显示标题列" 基本选单内容 (由选单列进入) (各项选单之功能将於下一节起陆续介绍) 2.1. "校时" 选项 2.2. "显示" 选项 2.3. "关於…" 选项: 显示关於对话盒 2.4. "最小化" 选项: 桌面上不显示此应用程式缩小為工作列状态区的图示 右键快速选单内容 (在视窗内按滑鼠右键显示选单) 系统工作列 (Task bar) 显示及选单:工作列中不显示任何项目,但是状态列中将显示一图示如下图 以滑鼠左键点选图示()可开啟或关闭应用程式视窗 以滑鼠右键点选图示,在放开右键时可看到简易功能选单如下图 校时设定对话盒说明:点选选单中 "网路校时设定…" 选项如下 可开啟如下图之对话盒以设定所有网路校正标準时间之相关参数 5.1 选取网路通讯协定 SNTP (Simple Network Time Protocol): RFC 1769,考虑网路传输延迟,并用以修正校时结果可显示至毫秒。 Time (TCP/UDP) : RFC868,不考虑网路传输延迟,以秒為单位。 5.2 NTP 标準时间伺服器网址设定 使用者可以如下图右按 "向下箭号" 直接由列示主机网址挑选,也可以直接在栏位中键入主机网路位址 (例如:time.stdtime.gov.tw) 或是 IP 位址 (例如:210.59.157.10),如果希望将键入之主机位址存入主机网址列示中请按 "增加" 按键如下图 要将某一网址由列示盒中删除则请先选取此网址然后按 "删除" 按键即可,要将全部使用者设定之网址清除请按 "预设" 按键 要透过全球资讯网查询可用之 NTP 标準时间伺服器位址请按 "线上查询" 按键 5.3 "立即查询主机时间" 按键 按下 "立即查询主机时间" 按键会依照目前校时主机栏位设定之网址查询该时间伺服器之时间,回应之标準时间显示在本应用程式视窗画面中,并且如下图所示在选单中显示目前系统时间与标準时间之误差 (例如:系统超前标準时间 1.363 秒),如果更改系统时间方式设定為每次查询后自动更改系统时间则按下 "立即查询主机时间" 按键后程式在得到标準时间后会一併更改系统时间為标準时间。如果更改系统时间方式设定為每次查询后手动更改系统时间,则系统只会显示标準时间但是不设定系统之时间。 5.4 时间校正讯息区: 讯息栏所显示之时间為列印此讯息时之系统时间 (并不是标準时间) 5.5 查询主机时间方式设定区 本应用程式可以让使用者设定週期性自动查询主机标準时间,使用者需要利用上图中横向卷动轴选择一自动校正时间之查询间隔,范围可由 20 秒至 10 日。选取手动查询主机标準时间则使用者必须经由 "立即查询主机时间" 按钮来查询。 5.6 更改系统时间方式 选取 "每次查询后自动更改系统时间",如此程式在每次查询完毕后自动修改系统时间,使用者不需要手动修改系统时间 请注意: 每当使用者选取 "每次自动更改系统时间" 选项后有两个系统选项会因此而稍微变化 1. 快速选单及标準选单中选项 "更改系统时间(x.xxx 秒)" 无法手动运作,校时及更改系统时间一个动作全部完成。 2. 由於每次透过网路校正时间后立即修正系统时鐘,因此系统与标準时间误差基本上為一很小之数值, "以校正时差更改系统时间" 不具太大意义,因此取消此功能按键 5.7 "重设校时界面" 按钮: 本按钮使用之时机在於当本机器传送出去的校时网路讯号遗失或是当校时主机回应之讯号遗失时,使用者可以按此按键重设网路界面。另外当使用者指定之标準时间伺服器网址错误时 (Domain Name 伺服器无法查得其 IP 位址时),或是无网路连接时使用者也可以按此按键重设网路界面。 5.8 "结束设定" 按钮: 使用者按下此按钮可结束此网路校时设定对话盒并储存所有更改之设定值 5.9 本栏位显示目前系统设定之时区资料,时区设定错误将导致校时的结果有数小时之偏差,可使用 "更改系统时间及时区…" 按键更改之 5.10 "目前系统时间" 显示的是个人电脑系统 CMOS 内所维持的时间 (仅显示至秒),其与标準时间之差异显示於其上一栏位资料 (例如:下图中显示系统落后 24.140 秒,也就是标準时间约為11:31:44 秒) 如要修改系统时间為标準时间使用者需按下 "以校正时差更改系统时间"按键,若是时区设定错误或是希望手动修改系统日期或是时间,使用者需按下 "更改系统时间及时区…" 按键,即可显示下面画面 5.11 如下图所示,使用者仅需将滑鼠置於本对话盒中任一按键或是选项上静止 0.5 秒以上程式会自动提示此按键之功能,例如下图中 "选择 SNTP 為校时通讯协定" 程式主选单功能说明 6.1 "校时" 功能选项:按下后显示下图之选单 6.1.1 "查询标準时间" 功能选项:本功能与 5.3 中 "立即查询主机时间" 具相同之功能,啟动系统查询网路时间之动作 6.1.2 "更改系统时间(系统超前/落后xxxxx秒)" 功能选项:与 5.9 "以校正时差更改系统时间"按键功能相同,利用上一次查询校正之标準时间来修正本机器之系统时间 6.1.3 "网路校时设定" 功能选项:本选项啟动网路校时设定对话盒 (五),使用者可设定网路校时之参数 6.1.4 "设定系统时区…" 功能选项:与 5.9 "更改系统时间及时区…" 按键功能相同,可啟动系统提供之设定程式 (见 5.9) 6.1.5 "结束" 功能选项:结束本应用程式 6.2 "显示" 功能选项:按下后显示下图之选单 6.2.1 "日期与时间格式设定…" 对话盒 6.2.2 "字型选取…" 对话盒 6.2.3 "显示标题列" 功能选项:与滑鼠左键在显示区内双击有相同功能 6.2.4 "桌面最上层" 功能选项:选取后视窗将永远保持在桌面的最上层,不会被别的应用程式遮盖掉 6.2.5 "置於 左上/左下/右上/右下 角" 功能选项:可将显示视窗移至萤幕的四个角落,保持视窗之显示大小 6.3 "关於…" 功能选项:按下后显示下图之关於对话盒 6.4. "最小化" 选项:桌面上不显示此应用程式缩小為工作列状态区的图示 滑鼠右键快速选单功能说明 7.1 "查询标準时间" 选项:如 6.1.1 说明 7.2 "更改系统时间 (系统时间落后/超前xxx秒)" 选项:如 6.1.2 说明 7.3 "网路校时设定…" 选项:如 6.1.3 说明 7.4 "设定系统时区…" 选项:如 6.1.4 说明 7.5 "显示设定…" 选项:如 6.2 说明 7.6 "最小化" 选项:如 6.4 说明 7.7 "关於…" 选项:如 6.3.1 说明 7.8 "结束" 选项:结束本应用程式 工作列图示右键快速功能选单说明 8.1 "查询标準时间" 选项:如 6.1.1 说明 8.2 "更改系统时间 (系统时间落后/超前xxx秒)" 选项:如 6.1.2 说明 8.3 "结束" 选项:结束本应用程式 网路校时程序说明 9.1 网路校时时序简介 透过网路 (区域网路或是广域网路) 与 NTP 伺服器连结读取标準时间基本上有几个简单的步骤: 首先程式会进行 "查询 (Query)"的动作,向 Domain Name 伺服器主机查询使用者所指定主机 (例: clock.stdtime.gov.tw) 之 IP 位址 (例:210.59.157.30); 如果是使用 TCP 通讯协定的话会进行 "连结 (Connect)" 的动作以与校时主机建立连线; "送出讯息 (Send)":此步骤中程式準备一个网路讯息封包包含了要求传回时间的讯息,然后程式开始等待远端伺服器的回应; "读取回应讯息 (Receive)":由所回应的讯息封包内读取所要求的时间讯息。 9.2 程式状态显示 在视窗左侧我们以 Q 代表 "查询主机位址中" C代表 "连结中" (Time/TCP 才有此步骤) S 代表 "送出讯息中" W 代表 "等待回应中" 通常比较容易在 Q, C 以及 W 三个状态下耽搁,若是在 Q 中耽搁的话,常常是因為无法联络 Domain Name 伺服器,或是在 DNS 上查无所指定时间伺服器之 IP 位址资讯,此时您必须耐心等候,大约两分鐘左右 DNS 查询会自动结束,请查明主机之网址或是检查网路连线及设定后重试。若是在 C 或是 W 中耽搁的话,可能是时间伺服器太忙碌了或是网路交通太拥挤而遗失了通讯封包,此时使用者可以稍待大约 25 秒若是仍无回应,程式会自动重设通讯界面,不管在任何状况下耽搁,使用者都可以直接按 "重设通讯界面" 按键来强迫系统结束目前所进行的动作并且重设通讯界面。 程式若是无法正常由网路校正时间,就会显示 F 在视窗的左下角 (如下图所示),因此画面上闪动显示的 F 代表上一次查询失败,程式没有得到标準时间。 若是透过网路校时成功的话视窗内会显示 N 如下图,若是看到 N 的话代表前一次透过网路校时顺利完成。 校正时间操作范例 10.1 设定全自动网路校时且修正系统时间 10.1.1 选取"网路校时设定…"功能选项 10.1.2 利用卷动轴设定自动查询间隔,如上图设為30分鐘 10.1.3 选取每次查询后自动更改系统时间 10.1.4 设定时间校正主机位址,如上图 clock.stdtime.gov.tw 10.1.5 查询主机时间方式选取週期性自动查询主机标準时间 10.1.6 按下 "结束设定" 按钮 10.2 手动校正时间并由程式自动修改系统时间 10.2.1 选取 "网路校时设定…" 功能选项 10.2.2 选取每次查询后自动更改系统时间 10.2.3 设定时间校正主机位址 10.2.4 查询主机时间方式选取手动查询主机标準时间 10.2.5 按下 "结束设定" 按钮 10.2.6 在系统选单中或右键选单中点选"查询标準时间"功能选项 程式设定值 请以 Windows 系统提供之登录 (Registry) 编辑程式 regedit 进行查询或修改,如下图中所示本程式之设定值储存於机码 HKEY_CURRENT_USER / Software / ChungHua Telecom Co., Ltd / NTPCLOCK / Settings 其内容如下图所示,第一次执行 NTPClock 时程式会自动做基本的设定,以后每次在程式对话盒中所做的修改都会自动储存於此。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值