【问题标题】:JAVA : Convert hour into UTC+1 during Winter and UTC+2 during SummerJAVA:在冬季将小时转换为 UTC+1,在夏季将小时转换为 UTC+2
【发布时间】:2020-11-26 18:10:31
【问题描述】:

我正在学习 Java,并尝试了解小时制的工作原理。 我使用的小时格式是HH:mm:ss。 我想在冬季将此字符串转换为 UTC+1 小时,在夏季将其转换为 UTC+2。 要知道日期,我使用格式:yyyy/MM/dd。 下面是我使用的变量类型的示例。

谁能帮我解决这个问题?

String Hour = "14:12:13"; 
String Date = "2019:11:12";

【问题讨论】:

  • 当您说“转换为 UTC+2”时,您的时间实例当前具有哪个时间偏移量?你能提供一个 MWE 的代码吗?
  • 您的示例日期和您的日期格式不匹配。 2019:11:12 不是格式为yyyy/MM/dd
  • 不要这样做! Java 有一些已经有时间的类。查看LocalTimeZoneDateTime。如果您退后一步并解释您要解决的问题可能会有所帮助。
  • 这个问题是不同国家对“夏天”的定义不同。我(德国人)曾经和一个德克萨斯人定期进行 Skype 聊天,结果发现,虽然我们都有夏令时,但我们的 DST 时间段不同,所以每年春季和秋季都有一个两周的时间段,我们之间的差异时区是错误的。所以,我完全同意@Matthew,你甚至不应该尝试自己实现它,而应该依赖预先存在的实现。 (顺便说一句,即使是 Sun Microsystems 的第一次尝试也很糟糕,不得不在 Java 8 中替换。)
  • 仅供参考:这里不用为你道歉英语,这实际上很好。这个网站看到许多非英语母语的人。并且不需要“提前致谢”,因为该网站旨在简洁、重点突出,并避免闲聊和无关的讨论。我针对这些要点编辑了您的问题。您在这里唯一的错误是在发布之前没有彻底搜索 Stack Overflow。基本的日期时间问题已被多次询问和回答。

标签: java utc hour


【解决方案1】:

我使用的小时格式是 HH:mm:ss

这是标准的ISO 8601 格式。

java.time 类在解析/生成文本时默认使用 ISO 8601 格式。

我想将此字符串转换为冬季的 UTC+1 小时和夏季的 UTC+2。

Java 包含OffsetTime 类来表示具有与UTC 偏移的时间。但这个概念是错误的。我的阅读和推理都无法理解有偏移但缺少日期的时间。

我相信这个类的存在只是为了匹配 SQL 规范定义的相同想法。再一次,据我所知,毫无意义。不是 SQL 规范中唯一没有意义的东西。

要知道日期,我使用格式:yyyy/MM/dd。

对于数据交换、日志记录和调试,我建议您坚持使用 ISO 8601 格式,即 YYYY-MM-DD。这就像您的格式,但使用连字符而不是斜杠作为分隔符。

为了向用户展示,让 Java 使用 DateTimeFormatter.ofLocalized… 方法自动本地化。为您的用户硬编码格式没有意义。

后面是我使用的变量类型的示例。

对于一天中的时间,请使用LocalTime

日期,请使用LocalDate

对于偏移量,使用ZoneOffset

对于时区,请使用ZoneId

暂时使用LocalDateLocalTimeZoneOffset 的组合得到OffsetDateTime。通常最好切换出ZoneId 的偏移量以获得ZonedDateTime

"14:12:13";字符串日期 = "2019:11:12"

LocalTime lt = LocalDate.parse( "14:12:13" ) ;
LocalDate ld = LocalDate.parse( "2019-11-12" ) ; 
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;

ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

这一切已经在 Stack Overflow 上被多次讨论过。所以,我在这里是简短的。搜索以了解更多信息。

【讨论】:

    【解决方案2】:

    我想在冬季将此字符串转换为 UTC+1 小时和 UTC+2 夏季。

    import java.time.LocalTime;
    import java.time.OffsetTime;
    import java.time.ZoneOffset;
    
    public class Main {
        public static void main(String[] args) {
            String timeString = "14:12:13";
            LocalTime time = LocalTime.parse(timeString);
            System.out.println(time);
    
            // Time at UTC+1
            OffsetTime timeAtUTC1 = time.atOffset(ZoneOffset.UTC).withOffsetSameInstant(ZoneOffset.ofHours(1));
            System.out.println(timeAtUTC1);
    
            // Time at UTC+2
            OffsetTime timeAtUTC2 = time.atOffset(ZoneOffset.UTC).withOffsetSameInstant(ZoneOffset.ofHours(2));
            System.out.println(timeAtUTC2);
        }
    }
    

    输出:

    14:12:13
    15:12:13+01:00
    16:12:13+02:00
    

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 2021-03-27
      • 2011-09-07
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2014-06-01
      • 2017-09-10
      相关资源
      最近更新 更多