使用timezone java将字符串转换为适当的日期

时间:2014-05-15 07:55:27

标签: java date timezone

我正在使用它的日期时区,我想将其转换为另一个时区,例如。我有Date' 3/15/2013 3:01:53 PM'这是在TimeZone' GMT-06:00'。我希望将其转换为GMT-05:00'时区。我有搜索很多,而且我对如何实际日期工作感到困惑。如何应用时区到目前为止。我尝试使用SimpleDateFormat,Calender以及偏移量。

DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa XXX");
df.setTimeZone(TimeZone.getTimeZone("GMT")); 
Date dt = null;
try {
    dt = df.parse("3/15/2013 3:01:53 PM -06:00");
} catch (ParseException e) {
    e.printStackTrace();
} 
String newDateString = df.format(dt);
System.out.println(newDateString);

它返回输出 03/15/2013 09:01:53 AM Z。 我想它应该是 03/15/2013 09:01:53 PM Z,因为格林威治标准时间-06:00'时区,所以在GMT中得到时间应该是HH + 6。我希望日期在" yyyy-MM-dd HH:mm:ss" HH在24小时内的格式。请帮我举个例子。提前致谢。

编辑:

我正在使用SimpleDateFormat

将字符串转换为日期
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss aaa");
    Date dt = null;
    try {
        dt = df.parse("3/15/2013 3:01:53 PM");
    } catch (ParseException e) {
        e.printStackTrace();
    }

现在,正如您所说,我已向Calender指定我的约会时间属于' GMT-06:00'时区并设定我的约会,

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-6"));
cal.setTime(dt);

现在,我告诉日历我想在GMT'

中约会
cal.setTimeZone (TimeZone.getTimeZone("GMT"));

的System.out.println(cal.getTime());

OutPut:

Fri Mar 15 03:01:53 CDT 2013

如果我出错了,请告诉我。

2 个答案:

答案 0 :(得分:9)

您需要两个格式对象,一个用于解析,另一个用于打印,因为您使用两个不同的时区,请参见此处:

// h instead of H  because of AM/PM-format
DateFormat parseFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX"); 
Date dt = null;
try {
  dt = parseFormat.parse("3/15/2013 3:01:53 PM -06:00");
}catch (ParseException e) {
  e.printStackTrace();
} 

DateFormat printFormat = new SimpleDateFormat("M/dd/yyyy hh:mm:ss aaa XXX"); 
printFormat.setTimeZone(TimeZone.getTimeZone("GMT-05")); 
String newDateString = printFormat.format(dt);
System.out.println(newDateString);

输出:3/15/2013 04:01:53 PM -05:00

如果您想要HH:mm:ss(24小时格式),那么您只需要替换

hh:mm:ss aaa 

通过

HH:mm:ss
printFormat-pattern中的


评论问题的其他方面:

java.util.Date没有内部时区,并且始终按规格引用UTC。您无法在此对象内更改它。格式化字符串可以进行时区转换,但正如我的代码示例所示(您希望转换为区域GMT-05)。

然后问题切换到使用UTC时区(符号Z)以ISO格式打印Date - 对象的新要求。这可以通过将模式替换为“yyyy-MM-dd'T'HH:mm:ssXXX”并将printFormat的时区显式设置为GMT + 00来完成格式化。你应该澄清你真正想要的格式化输出。

关于java.util.GregorianCalendar:此处设置时区是以编程方式更改日历对象,因此会影响calendar.get(Calendar.HOUR_OF_DAY)等方法调用。这与格式化无关!

答案 1 :(得分:0)

TL;博士

OffsetDateTime.parse( 
    "3/15/2013 3:01:53 PM -06:00" , 
    DateTimeFormatter.ofPattern( "M/d/yyyy H:mm:ss a XXX" )
).withOffsetSameInstant( 
    ZoneOffset.of( -5 , 0 ) 
)
  

2013-03-15T15:01:53-06:00

java.time

Answer by Hochschild是正确的但使用了过时的类。与最早版本的Java捆绑在一起的麻烦的旧日期时间类已被现代 java.time 类取代。

将输入字符串解析为OffsetDateTime,因为它包含来自UTC的偏移量,但不包含时区。

String input = "3/15/2013 3:01:53 PM -06:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/yyyy h:mm:ss a XXX" );
OffsetDateTime odt = OffsetDateTime.parse( input , f );
  

odt.toString():2013-03-15T15:01:53-06:00

提示:在将日期时间数据作为文本交换时,请省去一些麻烦并使用ISO 8601格式。在解析/生成字符串时,java.time类默认使用这些标准格式。

显然,您希望看到与其他人使用不同的UTC偏移量所看到的相同时刻。

ZoneOffset offset = ZoneOffset.of( -5 , 0 ) ;
OffsetDateTime odt2 = odt.withOffsetSameInstant( offset ) ;

我们看到偏移量从6变为5,并且每天的时间从15点变为16点。相同的时刻,不同的挂钟时间。

  

odt2.toString():2013-03-15T16:01:53-05:00

生成字符串

  

我希望日期为“yyyy-MM-dd HH:mm:ss”格式,其中HH在24小时内。

我建议您始终包含一些偏移或无区域的指示,您绝对可以确定用户从更大的上下文中理解。

您的格式几乎采用标准ISO 8601格式。你可以定义自己的格式化模式,但我只是用字符串操作来用空格替换中间的T

String output = odt2.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ).replace( "T" , " " ) ;
  

2013-03-15 16:01:53

关于 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