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

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

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 ,因为时间在'GMT-06:00'时区,所以应该用HH + 6来获得GMT时间。 我希望日期为“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());

输出:

Fri Mar 15 03:01:53 CDT 2013

请知道我是否会出错。


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

// 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模式中。


问题的其他方面的评论:

一个java.util.Date没有内部时区,并且通过spec来引用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)类的方法调用。 但这与格式无关!


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

答案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格式。 你可以定义你自己的格式化模式,但是我只需要进行字符串处理,用SPACE替换中间的T

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

2013-03-15 16:01:53


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了诸如java.util.DateCalendarSimpleDateFormat等麻烦的旧式遗留日期时间类。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

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

使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。 不需要字符串或java.sql。*类。

何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
  • 内置。
  • 带有捆绑实现的标准Java API的一部分。
  • Java 9增加了一些次要功能和修复。
  • Java SE 6Java SE 7
  • 大部分java.time功能都在ThreeTen-Backport中移植到Java 6和7。
  • Android的
  • 后续版本的java.time类的Android捆绑实现。
  • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport(上文提到)。 请参阅如何使用ThreeTenABP ...。
  • ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 您可以在这里找到一些有用的课程,例如IntervalYearWeekYearQuarter等。

    链接地址: http://www.djcxy.com/p/3111.html

    上一篇: Convert string to appropriate date with timezone java

    下一篇: Convert Date/Time for given Timezone