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相关推荐

  1. java中随机数怎么定义类_浅析Java中的随机数类

    Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...

  2. java中文件处理之图片_在Java 7中处理文件

    java中文件处理之图片 以下是The Well-Grounded Java Developer的草稿的修改后的片段. 它使您快速了解与以前版本相比,在Java 7中操作文件要容易得多. 通过使用新的 ...

  3. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  4. java中把gui插入图片_在java中使用图片实现gui的美化.pdf

    在java中使用图片实现gui的美化.pdf 还剩 3页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 图形图像处理GRAPHICS AND IMAGE ...

  5. java中获取文件总行数_关于java:如何以有效的方式获取文件中的行数?

    本问题已经有最佳答案,请猛点这里访问. 我有一个大文件. 它包括大约3.000-20.000行. 如何使用Java获取文件中的行总数? 从你的评论到答案来判断,你要找的词是"有效的" ...

  6. java中的解码和编码_关于java中编码和解码(一)

    关于java中编码和解码(一) 关于java中编码和解码(一) 计算机中所能表示的字符仅仅为0-255个,平时我们用到的语言太多,计算机本身根本无法表示.必须将我们的不同的语言转换为计算机所能理解的语 ...

  7. java中什么时候应用异常_生产Java应用程序中的十大异常类型-基于1B事件

    java中什么时候应用异常 Pareto记录原理:97%的记录错误语句是由3%的唯一错误引起的 在最新的数据整理帖子之后,我们收到了很多反馈和问题,我们发现97%的记录错误是由10个唯一错误引起的 . ...

  8. java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...

    [多选题]一个国家一定时期的商品销售额属于? [单选题]某厂2007年完成产值200万元,2008年计划增长10%,实际完成231万元,超额完成计划? [多选题]我国GDP每增长1%,相当于人均增加收 ...

  9. java中如何使用add方法_使用Java中的Calendar.add()方法将秒添加到当前日期

    为Java中的Calendar类导入以下软件包.import java.util.Calendar; 首先,创建一个Calendar对象并显示当前日期和时间.Calendar calendar = C ...

最新文章

  1. 推荐一位二本毕业1年,上海买房的大佬,牛逼!
  2. 十天学会AngularJS之02
  3. python123平台作业答案第十一周_第十一周作业
  4. vue中父组件怎么调用子组件
  5. (25):Silverlight 2 综合实例之Live Search
  6. Mac OSX Android 开发环境 模拟器报错
  7. 音乐标签编辑器 Meta 2.0.0 for Mac
  8. Infinity 插件设置
  9. ef常见面试题_C#基本面试题
  10. 直接加QQ好友的链接或会话的方法
  11. 实验一 9V稳压电源电路实验
  12. 重启计算机可以使用什么组合键,win10系统重启电脑的快捷键是什么呢?
  13. 可通过qq聊天机器人拿下服务器权限
  14. Zoommy for mac最新免费版(图片素材搜索下载软件)
  15. 哈希表解决冲突的两种方式
  16. pythonocc_如何在pythonOCC中使用样条曲线?
  17. Excel插件获取单元格批注以及设置批注
  18. 【JavaSE】java8 新特性
  19. 某银行计算机系统要实现一个电子,电子商务师练习题与答案
  20. DDos攻击是什么?怎么对应

热门文章

  1. python编写病毒扫描器_python实现集中式的病毒扫描功能详解
  2. 目标检测 R-CNN讲解ppt
  3. 数据结构期末复习资料:重点总结+题库(含答案详解),助你一天复习数据结构,高分通过数据结构期末考试!不挂科!
  4. 用matlab计算潮流牛拉法,matlab潮流计算
  5. 腾讯视频嵌入微信小程序
  6. idea下编译mybatis源码
  7. 数控等离子切割机,等离子切割机
  8. SRC之逻辑漏洞挖掘
  9. ArcGIS 区域统计分析(一)
  10. 机器学习之统计分析(2)