例如,2012-10-30T22:30:00 + 0300需要在2012-10-30T22:30:00-0600(例如当地时间)显示 需要在java中实现(android app) 我该如何管理呢?
答案 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)
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 类。
定义一个格式化程序以匹配您的输入。
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 [美国/蒙特利尔]
所有这些对象(odt
,instant
,zdtLondon
和zdtMontreal
)代表着非常同时的时刻,即时间轴上的同一点。相同的时刻,不同的时钟时间。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅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中添加内容打下了基础。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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());