Java中time用什么属性_覆盖Java System.currentTimeMillis以测试时间敏感的cod
TL;博士
有没有办法在代码或JVM参数中覆盖当前时间,如System.currentTimeMillis所示,而不是手动更改主机上的系统时钟?
是。
Instant.now(
Clock.fixed(
Instant.parse( "2016-01-23T12:34:56Z"), ZoneOffset.UTC
)
)
Clock在java.time中
我们有一个新的解决方案来解决可插拔时钟更换的问题,以便于使用虚假的日期时间值进行测试。 Java 8中的java.time包包含一个抽象类Clock,其目的明确:
允许在需要时插入备用时钟
您可以插入自己的Clock实现,但您可能会找到一个已满足您需求的实现。 为方便起见,java.time包含静态方法以产生特殊实现。 这些替代实现在测试期间可能是有价值的
改变了节奏
各种Clock方法产生的时钟以不同的节奏增加当前时刻。
默认情况下,Clock报告的时间在Java 8和Java 9中经常更新为毫秒,精确到纳秒(取决于您的硬件)。 您可以要求以不同的粒度报告真实的当前时刻。
Clock - 整秒的增量
Clock - 整分钟的增量
Clock - 传递的Clock参数的增量。
假时钟
某些时钟可能存在,产生的结果与主机OS的硬件时钟不同。
Clock - 将单个不变(非递增)时刻报告为当前时刻。
Clock - 报告当前时刻,但已通过传递的Clock参数进行了移位。
例如,锁定今年最早圣诞节的第一时刻。 换句话说,当圣诞老人和他的驯鹿第一次停下来时。 现在最早的时区似乎是Clock,电话:Clock。
LocalDate ld = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate xmasThisYear = MonthDay.of( Month.DECEMBER , 25 ).atYear( ld.getYear() );
ZoneId earliestXmasZone = ZoneId.of( "Pacific/Kiritimati" ) ;
ZonedDateTime zdtEarliestXmasThisYear = xmasThisYear.atStartOfDay( earliestXmasZone );
Instant instantEarliestXmasThisYear = zdtEarliestXmasThisYear.toInstant();
Clock clockEarliestXmasThisYear = Clock.fixed( instantEarliestXmasThisYear , earliestXmasZone );
使用该特殊固定时钟始终返回相同的时刻。 我们在Kiritimati获得了圣诞节的第一个时刻,UTC显示的是12月24日前一天早上十四点钟的挂钟时间。
Instant instant = Instant.now( clockEarliestXmasThisYear );
ZonedDateTime zdt = ZonedDateTime.now( clockEarliestXmasThisYear );
instant.toString():2016-12-24T10:00:00Z
zdt.toString():2016-12-25T00:00 + 14:00 [太平洋/ Kiritimati]
请参阅IdeOne.com中的实时代码。
真实的时间,不同的时区
您可以控制Clock实施分配的时区。 这在某些测试中可能很有用。 但我不建议在生产代码中使用此代码,您应始终明确指定可选的Pacific/Auckland或EST参数。
您可以指定UTC是默认区域。
ZonedDateTime zdtClockSystemUTC = ZonedDateTime.now ( Clock.systemUTC () );
您可以指定任何特定时区。 以Clock格式指定正确的时区名称,例如Clock,Clock或Pacific/Auckland.切勿使用3-4字母缩写,例如EST或IST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZonedDateTime zdtClockSystem = ZonedDateTime.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
您可以指定JVM的当前默认时区应该是特定Clock对象的默认时区。
ZonedDateTime zdtClockSystemDefaultZone = ZonedDateTime.now ( Clock.systemDefaultZone () );
运行此代码进行比较。 请注意,它们都报告了相同的时刻,即时间轴上的相同点。 它们的区别仅在于挂钟时间; 换句话说,三种说法相同的方式,三种方式来显示同一时刻。
System.out.println ( "zdtClockSystemUTC.toString(): " + zdtClockSystemUTC );
System.out.println ( "zdtClockSystem.toString(): " + zdtClockSystem );
System.out.println ( "zdtClockSystemDefaultZone.toString(): " + zdtClockSystemDefaultZone );
YearQuarter是运行此代码的计算机上的JVM当前默认区域。
zdtClockSystemUTC.toString():2016-12-31T20:52:39.688Z
zdtClockSystem.toString():2016-12-31T15:52:39.750-05:00 [美国/蒙特利尔]
zdtClockSystemDefaultZone.toString():2016-12-31T12:52:39.762-08:00 [America / Los_Angeles]
根据定义,YearQuarter类始终为UTC。 所以这三个与区域相关的用法具有完全相同的效果。
Instant instantClockSystemUTC = Instant.now ( Clock.systemUTC () );
Instant instantClockSystem = Instant.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
Instant instantClockSystemDefaultZone = Instant.now ( Clock.systemDefaultZone () );
instantClockSystemUTC.toString():2016-12-31T20:52:39.763Z
instantClockSystem.toString():2016-12-31T20:52:39.763Z
instantClockSystemDefaultZone.toString():2016-12-31T20:52:39.763Z
默认时钟
默认情况下,YearQuarter使用的实现是YearQuarter返回的实现。这是您未指定OffsetDateTime.now时使用的实现。请参阅YearQuarter的预发布Java 9源代码。
public static Instant now() {
return Clock.systemUTC().instant();
}
OffsetDateTime.now和ZonedDateTime.now的默认YearQuarter是Clock.systemDefaultZone().请参阅源代码。
public static ZonedDateTime now() {
return now(Clock.systemDefaultZone());
}
Java 8和Java 9之间的默认实现的行为发生了变化。在Java 8中,尽管类具有存储分辨率为纳秒的能力,但仅以毫秒为单位捕获当前时刻。 Java 9带来了一种新的实现方式,能够以纳秒的分辨率捕获当前时刻 - 当然,这取决于计算机硬件时钟的能力。
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,例如YearQuarter,YearQuarter,&YearQuarter。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310。
您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序。 不需要字符串,不需要YearQuarter类。
从哪里获取java.time类?
Java SE 8,Java SE 9及更高版本内置。
带有捆绑实现的标准Java API的一部分。
Java 9增加了一些小功能和修复。
Java SE 6和Java SE 7许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
Android的更高版本的Android捆绑java.time类的实现。
对于早期的Android(< 26),ThreeTenABP项目采用ThreeTen-Backport(如上所述)。 请参见如何使用ThreeTenABP ....
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,例如YearQuarter,YearQuarter,YearQuarter等。
Java中time用什么属性_覆盖Java System.currentTimeMillis以测试时间敏感的cod相关推荐
- java中随机数怎么定义类_浅析Java中的随机数类
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...
- java中文件处理之图片_在Java 7中处理文件
java中文件处理之图片 以下是The Well-Grounded Java Developer的草稿的修改后的片段. 它使您快速了解与以前版本相比,在Java 7中操作文件要容易得多. 通过使用新的 ...
- java中的深度克隆浅克隆_了解Java中的可克隆接口
java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...
- java中把gui插入图片_在java中使用图片实现gui的美化.pdf
在java中使用图片实现gui的美化.pdf 还剩 3页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 图形图像处理GRAPHICS AND IMAGE ...
- java中获取文件总行数_关于java:如何以有效的方式获取文件中的行数?
本问题已经有最佳答案,请猛点这里访问. 我有一个大文件. 它包括大约3.000-20.000行. 如何使用Java获取文件中的行总数? 从你的评论到答案来判断,你要找的词是"有效的" ...
- java中的解码和编码_关于java中编码和解码(一)
关于java中编码和解码(一) 关于java中编码和解码(一) 计算机中所能表示的字符仅仅为0-255个,平时我们用到的语言太多,计算机本身根本无法表示.必须将我们的不同的语言转换为计算机所能理解的语 ...
- java中什么时候应用异常_生产Java应用程序中的十大异常类型-基于1B事件
java中什么时候应用异常 Pareto记录原理:97%的记录错误语句是由3%的唯一错误引起的 在最新的数据整理帖子之后,我们收到了很多反馈和问题,我们发现97%的记录错误是由10个唯一错误引起的 . ...
- java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...
[多选题]一个国家一定时期的商品销售额属于? [单选题]某厂2007年完成产值200万元,2008年计划增长10%,实际完成231万元,超额完成计划? [多选题]我国GDP每增长1%,相当于人均增加收 ...
- java中如何使用add方法_使用Java中的Calendar.add()方法将秒添加到当前日期
为Java中的Calendar类导入以下软件包.import java.util.Calendar; 首先,创建一个Calendar对象并显示当前日期和时间.Calendar calendar = C ...
最新文章
- 推荐一位二本毕业1年,上海买房的大佬,牛逼!
- 十天学会AngularJS之02
- python123平台作业答案第十一周_第十一周作业
- vue中父组件怎么调用子组件
- (25):Silverlight 2 综合实例之Live Search
- Mac OSX Android 开发环境 模拟器报错
- 音乐标签编辑器 Meta 2.0.0 for Mac
- Infinity 插件设置
- ef常见面试题_C#基本面试题
- 直接加QQ好友的链接或会话的方法
- 实验一 9V稳压电源电路实验
- 重启计算机可以使用什么组合键,win10系统重启电脑的快捷键是什么呢?
- 可通过qq聊天机器人拿下服务器权限
- Zoommy for mac最新免费版(图片素材搜索下载软件)
- 哈希表解决冲突的两种方式
- pythonocc_如何在pythonOCC中使用样条曲线?
- Excel插件获取单元格批注以及设置批注
- 【JavaSE】java8 新特性
- 某银行计算机系统要实现一个电子,电子商务师练习题与答案
- DDos攻击是什么?怎么对应