【问题标题】:Change timezone in SimpleDateFormat()在 SimpleDateFormat() 中更改时区
【发布时间】:2014-05-17 03:45:01
【问题描述】:

我无法将服务器时区转换为我的时区。我的服务器在美国。

这是我的代码:

long orderID = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("hh':'mm':'ss' 'a");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kuala_Lumpur"));
Date orderTime = new Date(orderID);

System.out.print(sdf.format(orderTime));

但它仍然打印美国时间。如何解决?

【问题讨论】:

  • 请展示一些输出示例,其中包含演示问题的真实数据。您的格式中没有时间,因此在两个时区中很多时间会显示相同。
  • 为什么必须使用SimpleDateFormat?你已经有毫秒的时间了,肯定还有其他更合适的课程。带有 JodaTime 的日历、日期或其他内容。
  • @JoshM 您将如何使用String 和仅在 Java 8 之前的 JDK 中的类来表示 Date
  • @JimGarrison 对此感到抱歉。我只是更新我的问题
  • 试试 GMT+8 而不是 Asia/Kuala_lumpur

标签: java timezone simpledateformat


【解决方案1】:

与 Java 捆绑在一起的旧 java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。改用一个不错的日期时间库。这意味着 Joda-Time 或 Java 8 中捆绑的 java.time 包。

乔达时间

Joda-Time 2.3 中,一些示例代码。

实例化一个日期时间值,并分配一个时区。与 java.util.Date 不同,Joda-Time DateTime 实例知道自己分配的时区。

DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kuala_Lumpur" );
DateTime dateTime = DateTime.now( timeZone );

生成日期时间值的字符串表示形式。使用使用 JVM 的默认语言环境以本地化格式仅显示时间而不显示日期的格式。如果您需要特定的非本地化格式,请使用DateTimeFormat.forPattern 指定自定义格式。

DateTimeFormatter formatter = DateTimeFormat.forStyle( "-S" );
String output = formatter.print( dateTime );

如果您想指定区域设置,请致电formatter.withLocale( yourLocaleInstanceGoesHere)

转换为其他时区。

DateTime dateTimeUtc = dateTime.withTimeZone( DateTimeZone.UTC );

如果其他类需要,转换为 java.util.Date。

java.util.Date date = dateTime.toDate();

【讨论】:

  • 感谢您的回答..这给了我更多的知识:)
  • 仅供参考,最新版本的 Joda-time 代码中有一个错误,它不是 dateTime.withTimeZone(DateTimeZone.UTC),现在只是 dateTime.withZone(DateTimeZone.UTC)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多