如何让Java解析和格式化具有相同时区的日期/时间?我一直知道当地的时区

如何让Java解析和格式化具有相同时区的日期/时间?我一直知道当地的时区,java,timezone,utc,Java,Timezone,Utc,我的应用程序将所有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); 结果是 美国

我的应用程序将所有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);
结果是

美国东部时间2010年12月27日星期一15:01:57

我想要的是

2010年12月27日星期一20:01:57 UTC

显然,我必须设置一些区域设置和时区值,但我不知道应该将它们放在哪里。 谢谢 Pat

您可以为日期格式:

  dfmt.setTimeZone(timeZone);
此外,您不希望打印日期对象本身,而是再次使用DateFormat

  String formattedDate = dfmt.format(result);
您可以选择以下日期格式:

  dfmt.setTimeZone(timeZone);
此外,您不希望打印日期对象本身,而是再次使用DateFormat

  String formattedDate = dfmt.format(result);
避免java.util.Date 众所周知,旧的java.util.Date、.Calendar和SimpleDataFormat类非常麻烦。避开它们

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

  • 有一个深埋在里面的时区吗
  • 出于最实际的目的,忽略该时区
  • 有一个
    toString
    方法实现,在生成内部UTC日期时间值的字符串表示形式时应用JVM的当前默认时区
因此,对于一个天真的程序员来说,Date对象似乎有一个时区,但实际上始终是UTC(里面只有一个64位整数,一个来自的计数)

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

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

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

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

DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" ) );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( Locale.CANADA_FRENCH ).print( dateTimeMontréal );
默认情况下,Joda Time和java.Time都使用ISO 8601格式来生成和解析日期时间值的字符串表示形式

在乔达时间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 );
输入:271210 200157 UTC
日期时间UTC:2010-12-27T20:01:57.000Z
日期时间:2010-12-27T15:01:57.000-05:00
产出:隆迪27日2010年12月15日01时美国东部时间
避免java.util.Date 众所周知,旧的java.util.Date、.Calendar和SimpleDataFormat类非常麻烦。避开它们

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

  • 有一个深埋在里面的时区吗
  • 出于最实际的目的,忽略该时区
  • 有一个
    toString
    方法实现,在生成内部UTC日期时间值的字符串表示形式时应用JVM的当前默认时区
因此,对于一个天真的程序员来说,Date对象似乎有一个时区,但实际上始终是UTC(里面只有一个64位整数,一个来自的计数)

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

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

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

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

DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" ) );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( Locale.CANADA_FRENCH ).print( dateTimeMontréal );
默认情况下,Joda Time和java.Time都使用ISO 8601格式来生成和解析日期时间值的字符串表示形式

在乔达时间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 );
输入:271210 200157 UTC
日期时间UTC:2010-12-27T20:01:57.000Z
日期时间:2010-12-27T15:01:57.000-05:00
产出:隆迪27日2010年12月15日01时美国东部时间

谢谢。输出端的代码正是我想要的
SimpleDataFormat Outpmt=新的SimpleDataFormat(“EEE,d MMM yyyy HH:mm:ss Z”)
outfmt.setTimeZone(TimeZone.getTimeZone(“UTC”)
字符串formattedDate=outpmt.format(结果)
系统输出打印项次(格式化日期)
谢谢。输出端的这段代码正是我想要的
SimpleDataFormat Outpmt=新的SimpleDataFormat(“EEE,d MMM yyyy HH:mm:ss Z”)
outfmt.setTimeZone(TimeZone.getTimeZone(“UTC”)
字符串formattedDate=outpmt.format(结果)
系统输出打印项次(格式化日期)