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

“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);

这给了我正确的日期对象。现在我想将此日期显示为 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));
    }
}

输出:星期三7月8 12时08分48秒CDT 2009

其他提示

使用:

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

输出:

Wed Jul 08 12:08:48 CDT 2009

我的机器在你的榜样的日期。那就是在格式字符串ZZZ代ZZZ之后。

抱歉挖出一个老的线程。但我想知道是否有保存所有的时间区ID为常量类的Java类。 所以代替具有硬编码的时区ID,同时设置时区是这样的:

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

我们反而会做一些更标准/统一的:

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

其中SomeConstantClass.java是保持指的是不同的由TimeZone类支持的时区的IDS的常量的一个类。

现代方法是使用 java.time 类。

ZonedDateTime

指定格式模式以匹配您的输入字符串。代码类似于 SimpleDateFormat 但不完全是。请务必阅读课程文档 DateTimeFormatter. 。请注意,我们指定了一个 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[格林尼治标准时间]

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

指定一个 正确的时区名称 格式为 continent/region. 。切勿使用 3-4 个字母的缩写,例如 CDT 或者 EST 或者 IST 因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

我会猜测 CDT 你的意思是像时区 America/Chicago.

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdtChicago = zdt.withZoneSameInstant( z );

zdtChicago.toString() 2009-07-08T12:08:48-05:00[美国/芝加哥]

Instant

通常最好在 UTC 中工作。为此提取一个 Instant. 。这 Instant 类代表时间线上的一个时刻 世界标准时间 分辨率为 纳秒 (最多九 (9) 位小数)。

Instant class 是 java.time 的基本构建块类。你可以想到 ZonedDateTime 作为 Instant 加一个 ZoneId.

Instant instant = zdtChicago.toInstant();

instant.toString():07/08/2009 17:08:48


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些课程取代了麻烦的旧课程 遗产 日期时间类,例如 java.util.Date, .Calendar, & java.text.SimpleDateFormat.

乔达时间 项目,现在在 维护模式, ,建议迁移到 java.time。

要了解更多信息,请参阅 甲骨文教程. 。并在 Stack Overflow 上搜索许多示例和解释。规格为 JSR 310.

从哪里获取 java.time 类?

三十额外 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter, , 和 更多的.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top