将小时添加到包含 00:00:00 的字符串
Adding hours to a String containing 00:00:00
我要将 dateTime 变量发送到 API,它需要一个包含时间和日期的字符串。但我注意到存在时间差异,因为当我发送该变量时,它最终会增加两个小时。所以我需要给时间变量加上2小时。
我尝试拆分时间变量,将第一个元素解析为一个int并添加2,然后格式化为一个String等等,但这似乎非常不必要地长。有没有更简单的方法?我试图弄清楚如何使用时间对象并设置日期和时间,但我只知道如何设置为当前时间,但我不想这样做。下面的代码包含所需的值。
String date = "2019-05-09";
String time = "10:00:00";
String dateTime = (date + "T" + time + "Z");
此方法可能会给您有用的提示。输出为:2019-05-09 16:05
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now().plusHours(2);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(localDateTime.format(formatter));
}
Is there any easier way?
是的,使用现代java.time类。
显然,您正试图传达该日期的上午 10 点(UTC 时间)。示例代码中的 Z
表示 UTC,发音为“Zulu”。
为此,请使用 OffsetDateTime
和由 ZoneOffset.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 类 when parsing/generating 字符串中默认使用。
String output = odt.toString() ;
您没有准确解释这 2 小时的差异是如何出现的或在哪里出现的。我猜你看到的是从 UTC 调整到某个时区后的结果。如果是这样,你没问题。
如果两个人打电话,在相隔两个小时的时区,如果他们同时抬头从各自墙上的时钟上读取当前时间,一个人会看到上午 10 点,而另一个人会看到中午 12 点。同一时刻,时间轴上的同一点,不同的 wall-clock 时间。
您可以通过对可疑时区应用 ZoneId
来验证这一点,以查看生成的 ZonedDateTime
对象中的 wall-clock 时间值。
ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ; // Same moment, same point on the timeline, different wall-click time.
我要将 dateTime 变量发送到 API,它需要一个包含时间和日期的字符串。但我注意到存在时间差异,因为当我发送该变量时,它最终会增加两个小时。所以我需要给时间变量加上2小时。
我尝试拆分时间变量,将第一个元素解析为一个int并添加2,然后格式化为一个String等等,但这似乎非常不必要地长。有没有更简单的方法?我试图弄清楚如何使用时间对象并设置日期和时间,但我只知道如何设置为当前时间,但我不想这样做。下面的代码包含所需的值。
String date = "2019-05-09";
String time = "10:00:00";
String dateTime = (date + "T" + time + "Z");
此方法可能会给您有用的提示。输出为:2019-05-09 16:05
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now().plusHours(2);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(localDateTime.format(formatter));
}
Is there any easier way?
是的,使用现代java.time类。
显然,您正试图传达该日期的上午 10 点(UTC 时间)。示例代码中的 Z
表示 UTC,发音为“Zulu”。
为此,请使用 OffsetDateTime
和由 ZoneOffset.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 类 when parsing/generating 字符串中默认使用。
String output = odt.toString() ;
您没有准确解释这 2 小时的差异是如何出现的或在哪里出现的。我猜你看到的是从 UTC 调整到某个时区后的结果。如果是这样,你没问题。
如果两个人打电话,在相隔两个小时的时区,如果他们同时抬头从各自墙上的时钟上读取当前时间,一个人会看到上午 10 点,而另一个人会看到中午 12 点。同一时刻,时间轴上的同一点,不同的 wall-clock 时间。
您可以通过对可疑时区应用 ZoneId
来验证这一点,以查看生成的 ZonedDateTime
对象中的 wall-clock 时间值。
ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ; // Same moment, same point on the timeline, different wall-click time.