如何让Java解析并使用相同的时区格式化日期/时间?我一直在获取当地时区

时间:2010-12-29 04:45:45

标签: java timezone utc

我的应用程序将所有Java Date保留为UTC。解析它们很容易,但是当我打印出来时,显示屏会显示计算机的本地时区,我希望将其显示为UTC。

示例代码:

String sample = "271210 200157 UTC";
SimpleDateFormat dfmt = new SimpleDateFormat("ddMMyy HHmmss Z");
Date result = dfmt.parse(sample);
System.out.printf("%tc\n", result);

结果是

Mon Dec 27 15:01:57 EST 2010

我想要的是

Mon Dec 27 20:01:57 UTC 2010

显然我必须设置一些Locale和TimeZone值,但我看不到放在哪里。 谢谢 专利

2 个答案:

答案 0 :(得分:3)

你可以set the time zone获取DateFormat:

  dfmt.setTimeZone(timeZone);

此外,您不希望打印Date对象本身,而是再次使用DateFormat

  String formattedDate = dfmt.format(result);

答案 1 :(得分:1)

避免使用java.util.Date

旧的java.util.Date,.Calendar和SimpleDateFormat类非常麻烦。避免它们。

在众多问题中,有一个java.util.Date对象:

  • 有一个深埋在
  • 内的时区
  • 出于大多数实际目的,忽略该时区
  • 具有toString方法实现,在生成其内部UTC日期时间值的字符串表示时应用JVM的当前默认时区。

所以对于一个天真的程序员来说,Date对象似乎有一个时区,但实际上总是UTC(内部只有一个64位整数,来自epoch的计数)。

格式错误

输入字符串的格式很笨拙。特别是,使用年份的两位数是有问题的。

如果您有任何控制权,我强烈建议您更改它。第一种选择是遵循标准ISO 8601格式。

Joda-Time& java.time

使用Joda-Time或Java 8中内置的新java.time包(受Joda-Time启发)。

与java.util.Date不同,Joda-Time中的DateTime对象清楚地理解其自己指定的时区。如果省略时区,则会分配JVM的当前默认时区。我建议始终指定所需的时区。

Joda-Time和java.time默认使用ISO 8601格式生成和解析日期时间值的字符串表示。

在Joda-Time 2.7 ......

String input = "271210 200157 UTC";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "ddMMyy HHmmss z" ).withZoneUTC();
DateTime dateTimeUtc = formatter.parseDateTime( input );

易于调整时区。为了好玩,让我们将UTC值移动到魁北克时区。

DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" ) );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( Locale.CANADA_FRENCH ).print( dateTimeMontréal );

转储到控制台。

System.out.println( "input : " + input );
System.out.println( "dateTimeUtc : " + dateTimeUtc );
System.out.println( "dateTimeMontréal : " + dateTimeMontréal );
System.out.println( "output : " + output );
input : 271210 200157 UTC
dateTimeUtc : 2010-12-27T20:01:57.000Z
dateTimeMontréal : 2010-12-27T15:01:57.000-05:00
output : lundi 27 décembre 2010 15 h 01 EST