在当前时间显示ISO-8601日期+时间?

时间:2012-10-31 11:41:25

标签: java timezone utc

例如,2012-10-30T22:30:00 + 0300需要在2012-10-30T22:30:00-0600(例如当地时间)显示 需要在java中实现(android app) 我该如何管理呢?

3 个答案:

答案 0 :(得分:1)

这就是约会:一个普遍的时刻。在显示时选择适当的时区,您将拥有所需的时间字符串:

Date now = new Date();
DateFormat df = df.getDateTimeInstance();
System.out.println(df.format(now)); // now, displayed in the current time zone (examle: Germany)
df.setTimeZone(theLondonTimeZone);
System.out.println(df.format(now)); // now, displayed in the time zone of London

答案 1 :(得分:1)

tl; dr

OffsetDateTime
.parse( 
    "2012-10-30T22:30:00+0300" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" )
)
.toInstant()
.atZone(
    ZoneId.of( "Europe/London" ) 
)
.toString()

2012-10-30T19:30Z [欧洲/伦敦]

java.time

现代解决方案使用 java.time 类。

定义一个格式化程序以匹配您的输入。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ssX" ) ;

将输入解析为OffsetDateTime

String input = "2012-11-05T13:00:00+0200" ;
OffsetDateTime odt = OffsetDateTime.parse( input , f );

odt.toString():2012-11-05T13:00 + 02:00

提示:始终在偏移的小时和分钟之间包含冒号字符作为分隔符。然后,我们可以跳过自定义格式设置模式:OffsetDateTime.parse( "2012-11-05T13:00+02:00" )

通过提取Instant对象,将其调整为UTC,偏移量为零时分-秒。

Instant instant = odt.toInstant() ;

在标准ISO 8601格式中,最后的Z表示UTC(零偏移)。发音为“ Zulu”。

instant.toString():2012-11-05T11:00:00Z

调整为伦敦时间。

ZoneId zLondon = ZoneId.of( "Europe/London" ) ;
ZonedDateTime zdtLondon = instant.atZone( zLondon ) ;

zdtLondon.toString():2012-11-05T11:00Z [欧洲/伦敦]

调整到另一个时区。

ZoneId zMontreal = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtMontreal = instant.atZone( zMontreal );

zdtMontreal.toString():2012-11-05T06:00-05:00 [美国/蒙特利尔]

所有这些对象(odtinstantzdtLondonzdtMontreal)代表着非常同时的时刻,即时间轴上的同一点。相同的时刻,不同的时钟时间。


Table of all date-time types in Java, both modern and legacy


关于 java.time

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

要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规范为JSR 310

Joda-Time项目(现在位于maintenance mode中)建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持 java.time

在哪里获取java.time类?

https://i.stack.imgur.com/eKgbN.png 哪个Java.time库与哪个版本的Java或Android一起使用的表

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

使用joda时间库最佳地解决了我的问题,使用dateTime& dateTime区域如下:

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
    DateTime dt = new DateTime();
    DateTime dt2 = new DateTime();
    dt = DateTime.parse("2012-11-05T13:00:00+0200");
    System.out.println(dt.toString());

    dt2 = DateTime.parse("2012-11-05T21:45:00-08:00");
    DateTimeZone dtz = dt2.getZone();
    System.out.println(dt.withZone(dtz).toString());