可以说,我有一个代表,看起来像这样的日期字符串:
“周三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);
使用“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 [GMT]
我们可以调整到任何其他时区。
指定适当的时区名称 ,格式为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
类表示在时间轴上的时刻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 8和SE 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试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。