【问题标题】:Adding hours to a String containing 00:00:00将小时数添加到包含 00:00:00 的字符串
【发布时间】:2019-09-27 17:06:06
【问题描述】:

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

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

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

【问题讨论】:

  • “所以我需要在时间变量中增加 2 小时” - 或者...使用正确的时区?否则实际解析它可能比进行字符串操作更健壮。看看java.time API。
  • API 是否需要 UTC/GMT
  • 寻找 java.time.ZonedDateTime、LocalDateTime 类之类的 java 日期 API。他们有很好的api来添加小时、分钟、秒、时区转换等。它还有格式化程序,可以将其转换为您需要的格式。
  • Instant.parse(dateTime).plus(2, ChronoUnit.HOURS).toString()
  • 您可以尝试只发送-02:00 而不是Z。这告诉接收器时间来自比 UTC 晚 2 小时的时区,因此他们将为您添加 2 小时。可能。与其说是更方便,倒不如说是更正确。不过,请检查是否全年相差 2 小时。

标签: java string date converters


【解决方案1】:

有没有更简单的方法?

是的,使用现代的 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 点。同一时刻,时间轴上的同一点,不同的挂钟时间。

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

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

【讨论】:

    【解决方案2】:

    此方法可能会给您有用的提示。输出为: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));
    }
    

    【讨论】:

    • 从 OP 的帖子看来,可能需要进行时区转换。我添加只是为了表明如果需要时区转换,可以使用 ZonedDateTime。
    • 但是你什么都不解释,zdt的值是没有用的,所以我又问了一遍,把答案里写的都看了一遍:有什么意义? --- 我的第一条评论不仅仅是因为我想知道,而是告诉你答案令人困惑,你应该编辑它来澄清! --- 此外,我在问题中没有看到任何要求甚至暗示需要时区转换的内容。
    • 移除变量 zdt。
    • LocalDateTime 正是用于此问题的 wrong 类。这个问题的作者正在努力调整时区。但是LocalDateTime 缺少任何时区或偏移量的概念,因此无法进行所需的调整。我不喜欢投反对票,但我必须在这里。
    • @BasilBourque 在问题中,用户在哪里提到时区转换?用户只是询问增加 2 小时。你为什么假设他在问时区。 OP 清楚地说 需要一个包含时间和日期的字符串的 API 的 dateTime 变量 时区在哪里?我还是不明白你投反对票的概念。
    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多