java - 在不同时区之间格式化时间的正确方法是什么?

标签 java formatting timezone jodatime

我想将 19:19:00 等时间格式化为不同的时区。如果我使用 SimpleDateFormat 它总是考虑纪元的开始:1970.01.01。

某些时区在纪元开始时和现在有不同的偏移量。例如,现在与欧洲/基辅的默认偏移量是 UTC+0200,但在 1970 年它是 UTC+0300。这意味着,如果我在欧洲/基辅下运行服务器,则在欧洲/柏林(UTC+0100)下登录的客户端将看到三个小时的差异,而不是两个小时。

我可以通过为java.sql.Time编写自定义格式化程序来解决这个问题。但我想问也许有一些通用的方法或Java工具/库可以解决这个问题。

另一个解决方案可以使用 joda-time:

TimeZone.setDefault(TimeZone.getTimeZone("Europe/Kiev"));
DateTimeZone.setDefault(DateTimeZone.forID("Europe/Kiev"));

DateTimeFormat.forPattern("HH:mm:ss.SSS")
   .withZone(DateTimeZone.forID("Europe/Berlin"))
   .print(Time.valueOf("19:00:00").getTime());

最佳答案

您不能仅仅将时间格式化为不同的时区。你需要一个约会。

如果您想假设该时间的日期是今天,您可以尝试以下代码:

ZoneId originalZone = ZoneId.of("Europe/Kiev");
ZoneId targetZone = ZoneId.of("Europe/Berlin");
LocalTime originalTime = LocalTime.parse("19:19:00");
LocalTime convertedTime = LocalDate.now(originalZone)
                            .atTime(originalTime)
                            .atZone(originalZone)
                            .withZoneSameInstant(targetZone)
                            .toLocalTime();
System.out.println(convertedTime);

关于java - 在不同时区之间格式化时间的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50601391/

相关文章:

java - 作为参数的静态函数 (::) 抛出错误

java - 为什么在通过 data.sql 文件导入时会出现此错误 "Error creating bean with name ' entityManagerFactory' defined in class path resource”

asp.net - 你能从请求变量中确定时区吗?

java - 由 : java. lang.ClassNotFoundException : org. apache.zookeeper.KeeperException 引起

java - 我如何在我的应用程序中共享 apk 文件(发送应用程序本身)

java - 如何使用输入大小修饰符打印长类型值?

java - 强制点 (".")作为java中的小数分隔符

html - css 文本背景对于文本行之间的空间不同

ruby-on-rails - Rails Postgres 时区处理

iphone - NSTimeZone timeZoneWithName : works not properly