日期时间字符串+ TimeZone

时间:2014-08-28 21:18:51

标签: java parsing date datetime time

我有一个本地日期时间的字符串表示,以及一个Java TimeZone。

我正在尝试以MM / dd / yyyy HH:mm:ssZ格式输出,但我无法弄清楚如何使用正确的日期时间和时区创建Calendar或JodaTime对象。如何将TimeZone转换为可由SimpleDateFormat' Z'解析的值。或者' z'?

TimeZone tz = TimeZone.getTimeZone("America/Chicago");
String startDate = "08/14/2014 15:00:00";

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Calendar cal = Calendar.getInstance(tz);
cal.setTime(sdf.parse(startDate));
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ssZ");

sdfZ.format(cal.getTime()) 

返回

08/14/2014 15:00:00-0400

EST

是创建日历或Joda DateTime的唯一解决方法,并通过解析字符串" 08/14/2014 15:00:00"来设置单个年/月/日/小时/分钟值。 ?

2 个答案:

答案 0 :(得分:1)

日历getTime() - 返回一个Date对象,表示此Calendar的时间值(距Epoch(01-01-1970 00:00 GMT)"毫秒的偏移量),无论您在哪个时区正在展示。但是在不同TimeZone中的一天中的时间会有所不同。 get(Calendar.HOUR_OF_DAY)

你应该试试

sdfZ.setTimeZone(tz);

答案 1 :(得分:0)

TL;博士

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Chicago" ) ) ;
String output = zdt.toInstant().toString() ;
  

2016-12-03T10:15:30Z

java.time

java.util.Calendar类和Joda-Time库都已被java.time类取代。

Instant

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

Instant instant = Instant.now(); 

调用toString以标准ISO 8601格式生成字符串。例如,2011-12-03T10:15:30Z。此格式适用于序列化数据存储或交换的日期时间值。

String output = instant.toString();  // Ex: 2011-12-03T10:15:30Z

时区

指定时区。

ZoneId z = ZoneId.of( "America/Chicago" );
ZonedDateTime zdt = instant.atZone( z );

作为快捷方式,您可以跳过使用Instant

ZonedDateTime zdt = ZonedDateTime.now( z );

toString上调用ZonedDateTime可获得标准ISO 8601格式的扩展版本,其中时区的名称附加在方括号中。例如,2007-12-03T10:15:30+01:00[Europe/Paris]

String output = zdt.toString(); //  Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]

DateTimeFormatter

DateTimeFormatter类有一个预定义的格式化程序常量,用于所需的输出:DateTimeFormatter.ISO_LOCAL_DATE_TIME

String output zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME );

关于 java.time

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

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

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

如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。

从哪里获取java.time类?

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