Java 如何显示带有自定义时区的日期?

Java 如何显示带有自定义时区的日期?,java,date,timezone,date-format,Java,Date,Timezone,Date Format,假设我有一个字符串,表示如下所示的日期: DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy"); Date fromDate = (Date)formatter.parse(fromDateString); formatter.setTimeZone(TimeZone.getTimeZone("US/Central")); “2009年7月8日星期三17:08:48 GMT” 因此,我将该字符串

假设我有一个字符串,表示如下所示的日期:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
“2009年7月8日星期三17:08:48 GMT”

因此,我将该字符串解析为一个日期对象,如下所示:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
这给了我正确的日期对象。现在我想把这个日期显示为CDT值

我试过很多东西,但我就是不能让它正常工作。必须有一个简单的方法使用DateFormat类来实现这一点。有什么建议吗?我最后一次尝试是:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);
使用“zzz”而不是“zzz”:“Z”是RFC822时区的符号

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
话虽如此,我对日期/时间的标准建议是使用,这是一个更好的API

编辑:简短但完整的程序:

import java.text.*;
import java.util.*;

public class Test
{
    public List<String> names;

    public static void main(String [] args)
        throws Exception // Just for simplicity!
    {
        String fromDateString = "Wed Jul 08 17:08:48 GMT 2009";
        DateFormat formatter = new SimpleDateFormat
            ("EEE MMM dd HH:mm:ss zzz yyyy");
        Date fromDate = (Date)formatter.parse(fromDateString);
        TimeZone central = TimeZone.getTimeZone("America/Chicago");
        formatter.setTimeZone(central);
        System.out.println(formatter.format(fromDate));
    }
}
import java.text.*;
导入java.util.*;
公开课考试
{
公开名单名称;
公共静态void main(字符串[]args)
抛出异常//只是为了简单!
{
String fromDateString=“Wed Jul 08 17:08:48 GMT 2009”;
DateFormat格式化程序=新的SimpleDateFormat
(“EEE MMM dd HH:mm:ss zzz yyyy”);
Date fromDate=(日期)格式化程序.parse(fromDateString);
时区中心=TimeZone.getTimeZone(“美国/芝加哥”);
格式化程序。设置时区(中央);
System.out.println(formatter.format(fromDate));
}
}
输出:星期三7月8日12:08:48 CDT 2009使用:

formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
产出:

Wed Jul 08 12:08:48 CDT 2009

在我的机器上查看您示例中的日期。这是在格式字符串中用zzz替换zzz之后。

很抱歉挖出了一个旧线程。但我想知道是否有一个java类将所有时区ID作为常量类保存。 因此,在如下设置时区时,不必硬编码时区id:

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
Date fromDate = (Date)formatter.parse(fromDateString);
formatter.setTimeZone(TimeZone.getTimeZone("US/Central"));
相反,我们将做一些更标准/统一的事情:

formatter.setTimeZone(TimeZone.getTimeZone(SomeConstantClass.US_CENTRAL)); 

其中SomeConstantClass.java是一个类,它包含引用时区类支持的不同时区ID的常量。

现代方法是使用java.time类

ZoneDateTime
指定与输入字符串匹配的格式模式。这些代码类似于
SimpleDataFormat
,但并不完全相同。请务必阅读课程文档以了解更多信息。请注意,我们指定了一个
Locale
,以确定使用哪种人类语言来表示星期几的名称和月份的名称

String input = "Wed Jul 08 17:08:48 GMT 2009";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" , Locale.ENGLISH );
ZonedDateTime zdt = ZonedDateTime.parse ( input , f );
zdt.toString():2009-07-08T17:08:48Z[GMT]

我们可以将其调整到任何其他时区

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
大陆/地区
的格式指定。切勿使用3-4个字母的缩写,如
CDT
EST
IST
,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)

我猜你所说的CDT是指像美国/芝加哥这样的时区

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );
[美国/芝加哥]

Instant
通常最好在UTC工作。为此,提取一个
即时
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

这个
Instant
类是java.time的基本构建块类。您可以将
ZonedDateTime
看作是一个
即时
加上一个
ZoneId

Instant instant = zdtChicago.toInstant();
instant.toString():2009-07-08T17:08:48Z


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门针对Android采用了Three Ten Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里找到一些有用的类,如、、和。

遗憾的是,如果没有更多我想处理的繁文缛节,我无法添加另一个依赖项。必须有一种使用标准java库格式化时区的方法。如果你不得不进行任何其他日期/时间操作,你只需要期待更多的痛苦。这没有帮助。格式化程序总是以GMT而不是要求的CDT来显示时间。然后你使用了错误的时区-在我的测试用例中它工作得很好。我将添加一个简短但完整的程序来演示。是的,你是对的。。。老兄,真让人痛苦。我一直使用正确的代码,而我的单元测试中的一个输入错误使它无法正常工作。