如何让 Java 解析和格式化具有相同时区的日期/时间?我不断获取当地时区

发布于 2024-10-10 00:11:25 字数 445 浏览 6 评论 0原文

我的应用程序将所有 Java 日期保存为 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 值,但我不知道该放在哪里他们。 谢谢 拍

My application keeps all Java Date's in UTC. Parsing them is easy, but when I print them out, the display shows the computer's local time zone, and I want to show it as UTC.

Example code:

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

the result is

Mon Dec 27 15:01:57 EST 2010

What I want is

Mon Dec 27 20:01:57 UTC 2010

Clearly I have to set some Locale and TimeZone values, but I don't see where to put them.
Thanks
Pat

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不即不离 2024-10-17 00:11:25

您可以 为DateFormat设置时区

  dfmt.setTimeZone(timeZone);

另外,你不想打印Date对象本身,而是再次使用DateFormat

  String formattedDate = dfmt.format(result);

You can set the time zone for the DateFormat:

  dfmt.setTimeZone(timeZone);

Also, you do not want to print the Date object itself, but again use the DateFormat

  String formattedDate = dfmt.format(result);
别靠近我心 2024-10-17 00:11:25

避免 java.util.Date

旧的 java.util.Date、.Calendar 和 SimpleDateFormat 类非常麻烦。避开他们。

许多问题之一是 java.util.Date 对象:

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

因此,对于天真的程序员来说,Date 对象似乎有一个时区,但实际上始终是 UTC(内部只是一个 64 位整数,来自 纪元)。

格式错误

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

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

乔达时间与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

Avoid java.util.Date

The old java.util.Date, .Calendar, and SimpleDateFormat classes are notoriously troublesome. Avoid them.

Among the many problems is the fact that a java.util.Date object:

  • Has a time zone buried deep inside
  • Ignores that time zone for most practical purposes
  • Has a toString method implementation that applies the JVM’s current default time zone when generating the String representation of its internal UTC date-time value.

So to a naïve programmer, the Date object seems to have a time zone but is actually always is UTC (just a 64-bit integer inside, a count from epoch).

Bad Format

The format of your input string is clumsy. In particular, using two digits for the year is problematic.

If you have any control, I strongly suggest changing it. The first choice is to follow the standard ISO 8601 formats.

Joda-Time & java.time

Use either Joda-Time or the new java.time package built into Java 8 (and inspired by Joda-Time).

Unlike a java.util.Date, a DateTime object in Joda-Time clearly understands its own assigned time zone. If you omit the time zone, the JVM’s current default time zone is assigned. I recommend always specifying the desired time zone.

Both Joda-Time and java.time use ISO 8601 formats by default for both generating and parsing String representations of date-time values.

In Joda-Time 2.7…

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

Easy to adjust time zone. For fun, let's move that UTC value into Québec time zone.

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

Dump to console.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文