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



我有日期与它的时区,我想把它转换为另一个时区,例如,我有日期'3/15/2013 3:01:53 PM',这是在时区'GMT-06:00'。我想将其转换为'GMT-05:00'时区。我有很多搜索,我对实际日期是如何工作的感到困惑。如何将时区应用于日期。我已经尝试了SimpleDateFormat, calendar和offset。

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();
    }

现在,正如你所说,我指定我的日期在'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-pattern


评论问题的其他方面:

A java.util.Date没有内部时区,总是通过spec引用UTC。在该对象中不能更改它。可以对格式化的字符串进行时区转换,但是正如我的代码示例所演示的那样(您希望转换为时区GMT-05)。

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

关于java.util.GregorianCalendar:在这里设置时区是以编程的方式更改日历对象,因此它会影响calendar.get(Calendar.HOUR_OF_DAY)等方法调用。然而,这与格式没有任何关系!

br

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 - 15 - t15:01:53 06:00时

<标题> java.time h1> Hochschild的答案是正确的,但使用了过时的类。与早期Java版本捆绑在一起的麻烦的旧日期时间类已经被现代的 Java所取代。时间类。

将输入字符串解析为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 - 15 - t15: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 - 15 - t16:01:53凌晨

<标题> 生成字符串

我想要日期为"yyyy-MM-dd HH:mm:ss"格式,其中HH为24小时。

我建议你总是包括一些偏移量或区域的指示,除非你绝对确定用户从更大的上下文中理解。

你的格式几乎是标准的ISO 8601格式。您可以定义自己的格式化模式,但我只会做字符串操作,将中间的T替换为SPACE。

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.Date, Calendar, &SimpleDateFormat .

Joda-Time项目,现在处于维护模式,建议迁移到java。时间类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。

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

从哪里获取java。时间类?

  • Java SE 8Java SE 9,以及更高版本
    • 内置。
    • 标准Java API的一部分,捆绑实现。
  • Java 9增加了一些小的特性和修复。
  • Java SE 6Java SE 7
    • 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • Android版本的java bundle实现。时间类。
    • 对于早期的Android, ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…
  • ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

    相关内容

    • 没有找到相关文章

    最新更新