如何使用自定义时区显示日期?

时间:2009-07-22 16:25:25

标签: java date timezone date-format

假设我有一个表示日期的字符串:

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

这给了我正确的日期对象。现在我想将此日期显示为CDT值。

我尝试了很多东西,但我无法让它正常工作。必须有一个使用DateFormat类的简单方法才能使其工作。有什么建议?我的最后一次尝试是这样的:

formatter.setTimeZone(toTimeZone);
String result = formatter.format(fromDate);

4 个答案:

答案 0 :(得分:18)

使用“zzz”代替“ZZZ”:“Z”是RFC822时区的符号。

DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

话虽如此,我对日期/时间的标准建议是使用Joda Time,这是一个更好的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));
    }
}

输出:Wed Jul 08 12:08:48 CDT 2009

答案 1 :(得分:3)

使用:

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

输出:

Wed Jul 08 12:08:48 CDT 2009

代表我机器上示例中的日期。那是在zzz中用格式字符串替换ZZZ之后。

答案 2 :(得分:2)

很抱歉挖出一个旧帖子。但我想知道是否有一个java类将所有time-zone-id保存为常量类。 因此,在设置时区时,不必硬编码时区ID:

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

我们宁愿做更标准/统一的事情:

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

其中SomeConstantClass.java是一个类,它包含引用TimeZone类支持的不同time-zone-id的常量。

答案 3 :(得分:1)

现代的方法是使用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 [GMT]

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

continent/region的格式指定proper time zone name。切勿使用诸如CDTESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

我会猜到CDT你的意思是America/Chicago时区。

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

zdtChicago.toString()2009-07-08T12:08:48-05:00 [America / Chicago]

Instant

通常最好以UTC工作。对于该提取,InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

这个Instant类是java.time的基本构建块类。您可以将ZonedDateTime视为Instant加上ZoneId

Instant instant = zdtChicago.toInstant();
  

instant.toString():2009-07-08T17:08:48Z

关于java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

相关问题