首页 > 解决方案 > 将小时数添加到包含 00:00:00 的字符串

问题描述

我要将 dateTime 变量发送到一个 API,该 API 需要一个包含时间和日期的字符串。但我注意到存在时间差,因为当我发送该变量时,它最终会增加两个小时。所以我需要在时间变量中增加 2 小时。

我尝试拆分时间变量,将第一个元素解析为 int 并添加 2,然后格式化为 String 等等,但这似乎非常不必要。有没有更简单的方法?我试图弄清楚如何使用时间对象并设置日期和时间,但我只知道如何设置为当前时间,我不想这样做。下面的代码包含所需的值。

String date = "2019-05-09";
String time = "10:00:00";
String dateTime = (date + "T" + time + "Z");

标签: javastringdateconverters

解决方案


有没有更简单的方法?

是的,使用现代java.time类。

显然,您正试图在 UTC 日期的上午 10 点进行交流。在Z您的示例代码中表示 UTC,发音为“Zulu”。

为此,请使用OffsetDateTimeZoneOffset.UTC常量指定的偏移量。

LocalDate ld = LocalDate.parse( "2019-05-09" ) ;
LocalTime lt = LocalTime.parse( "10:00:00" ) ;
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;

显然,您希望将此值作为标准ISO 8601格式的字符串发送。在解析/生成字符串时,这些格式默认在java.time类中使用。

String output = odt.toString() ;

您没有准确解释这 2 小时差异出现的方式或位置。我猜想您在从 UTC 调整到某个时区后会看到结果。如果是这样,你没有问题

如果两个人在相隔两个小时的时区打电话,如果他们同时抬头从各自墙上的时钟上读取当前时间,一个人会看到上午 10 点,而另一个人看到中午 12 点。同一时刻,时间轴上的同一点,不同的挂钟时间。

您可以通过为可疑时区应用 a 来验证这一点,以查看结果对象 ZoneId中的挂钟时间值。ZonedDateTime

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;  // Same moment, same point on the timeline, different wall-click time. 

推荐阅读