当前位置: 首页 > 知识库问答 >
问题:

如何在java中模拟时间戳和日期函数?

丌官高远
2023-03-14

如何模拟以下代码?我不想更改代码。

Date date = new Date();
String res_timestamp=new Timestamp(date.getTime()).toString();

我的代码:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("PST"));
    Date NOW = sdf.parse("2019-02-11 00:00:00");
    Timestamp time=new Timestamp(NOW.getTime());
    whenNew(Timestamp.class).withNoArguments().thenReturn(time);

我怎么能嘲笑它呢?我发现很难嘲笑它。

我该怎么解决呢?

注意:我不想更改我的代码。在不改变代码的情况下,我不得不模仿这两行代码。

共有1个答案

米景辉
2023-03-14
  • 使用java.time.时钟ZonedDateTimeInstantZoneId
  • 将更改后的时钟对象作为依赖项注入:Clock.fixed(...)
  • 永远不要使用DateCalendarSimpleDateFormatTimestampTimeZone

您使用的日期时间类非常糟糕,多年前已经被java取代。JSR 310定义的时间类。

java.time.时钟类提供了几种适合测试的替代行为。其中包括固定时间点、更改的节奏和从当前时刻进行调整。

将这些时钟对象之一传递给java.time类中的各种方法,以供您进行测试。

PST不是时区。以大陆/地区的格式指定适当的时区名称,例如美国/蒙特利尔非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;

建立你心中测试的特定时刻。

LocalDate ld = LocalDate.of( 2019 , 2 , 11 ) ;
LocalTime lt = LocalTime.MIN ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

zdt.toString(): 2019-02-11T00:00-08:00[America/Los_Angeles]

呼叫时钟。固定的需要一个瞬间,一个UTC时刻。我们可以通过提取一个即时,将分区值调整为UTC。同一时刻,时间线上的同一点,不同的挂钟时间。

Instant instant = zdt.toInstant() ;

瞬间toString():2019-02-11T08:00:00Z

指定一个时钟,它将当前时刻永远报告为该特定时刻,而不递增。

Clock clock = Clock.fixed( instant , z ) ;

clock.toString():固定时钟[2019-02-11T08:00:00Z, America/Los_Angeles]

将固定时钟作为依赖项注入。

Instant now = Instant.now( clock ) ;  // Tell me a lie.

now.toString(): 2019-02-11T08:00:00Z

查看此代码在IdeOne上的实时运行。通用域名格式。

如果您正在实例化java。sql。时间戳要与数据库一起使用,请使用java。时间课。从JDBC 4.2开始,我们可以交换java。数据库中的时间对象。

您的JDBC驱动程序可能对Instant有可选的支持。

myPreparedStatement.setObject( … , instant ) ;            // Storing data.
Instant instant = myResultSet.get( … , Instant.class ) ;  // Retrieving data.

您的驱动程序必须支持OffsetDateTime

myPreparedStatement.setObject( … , instant.atOffset( ZoneOffset.UTC ) ) ;            // Storing data.
OffsetDateTime odt = myResultSet.get( … , OffsetDateTime.class ) ;  // Retrieving data.

调整到一个时区。

ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.DateCalendar

Joda Time项目现在处于维护模式,建议迁移到java。时间课。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

你可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java。sql* 类。

从哪里获得java.time课程?

  • JavaSE 8、JavaSE 9、JavaSE 10、JavaSE 11及更高版本-标准JavaAPI的一部分,具有捆绑实现。
    • Java9增加了一些小功能和修复。
    • 大部分的java应用程序。时间功能被重新移植到Java 6
    • 更高版本的Android捆绑包实现了java。时间课
    • 对于早期的Android系统(

    额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,等等。

 类似资料:
  • 问题内容: 我在来自Linux服务器的json中有一个时间戳。我想使用Java将其转换为简单的日期时间格式。 我需要以下格式的日期和时间:dd-mm-yyyy hh:mm:ss 这是我的JSON数据: 问题答案: 批处理日期 看起来像是从时代开始的几秒钟, 所以 然后使用SimpleDateFormat应该可以解决问题 -代码- -输出-

  • 在Java中获取计数后,如何将“时间戳”转换为? 我目前的代码如下: 这里我得到的输出是2012-08-07 0,但是等效查询返回3。为什么我得到0?

  • 问题内容: 在Java应用程序中,使用日期时间和时间戳的混合在MySQL数据库中添加和输入日期信息方面有什么好的折衷办法? 问题答案: 在Java方面,日期通常由(设计欠佳,但不包括在内)表示。它基本上是由支持大纪元时间中的味道long,也称为时间戳。它包含有关日期和时间部分的信息。在Java中,精度以毫秒为单位。 在SQL方面,有几个标准的日期和时间类型,DATE,TIME和TIMESTAMP(

  • 问题内容: 论坛成员 我在Java中遇到日期时间问题。实际上,我正在接收 格式为2012-02-27T01:10:10 的开始日期,并且我想将接收到的日期插入具有datetime数据类型的数据库中。 实际上,我尝试通过以下代码将收到的开始日期转换为日期时间 但是使用上面的代码,只有 日期被添加到我的数据库中,例如2012-02-27 00:00:00 我也想将时间添加到数据库中,但是当我将Simp

  • 然后将变量持久化到MySQL表列中。 然而,虽然通过调试,我看到对象显示在正确的时区GMT+1,但在数据库上持久化时,它是一个GMT时区,所以要追溯一个小时。 使用函数返回一个GMT+1日期。 连接字符串为,没有任何参数。 编辑:找到这段代码

  • 问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期是太平洋标准时间(PST)2018-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下,530pm是UTC 530pm。显示时,它将被格式