如何显示一个自定义时区的日期?(How do I display a date with a cus

2019-07-30 15:23发布

可以说,我有一个代表,看起来像这样的日期字符串:

“周三7月8 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);

Answer 1:

使用“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年



Answer 2:

使用:

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

输出:

Wed Jul 08 12:08:48 CDT 2009

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



Answer 3:

对不起,挖出一个旧的线程。 但我想知道是否有保存所有的时间区ID为常量类的Java类。 因此,而不必硬编码的时区ID在设定时区是这样的:

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

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

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

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



Answer 4:

现代的方法是用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 。 切勿使用3-4个字母的缩写,如CDTESTIST ,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。

我想,通过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类表示在时间轴上的时刻UTC ,分辨率为纳秒 (最多9个(9)小数的位数)。

这种Instant类是基本构建块类java.time的。 你能想到的ZonedDateTime作为Instant加上ZoneId

Instant instant = zdtChicago.toInstant();

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


关于java.time

该java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.Date.Calendar ,与java.text.SimpleDateFormat

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

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • 的Java SE 8SE 9和后
    • 内置。
    • 具有捆绑实现标准Java API的一部分。
    • Java的9增加了一些小的功能和修复。
  • Java SE 6中SE 7
    • 多的java.time功能后移植到Java 6和7在ThreeTen-反向移植
  • Android的
    • 所述ThreeTenABP项目适应于Android ThreeTen-反向移植 (上面提到的)特异性。
    • 请参阅如何使用......

该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多 。



文章来源: How do I display a date with a custom timezone?