将UTC转换为当前的语言环境时间

我正在从web服务下载一些JSON数据。 在这个JSON中,我有一些date/时间值。 UTC中的所有内容。 我怎样才能parsing这个datestring,所以结果date对象是在当前的语言环境?

例如:服务器返回“2011-05-18 16:35:01”,我的设备现在应该显示“2011-05-18 18:35:01”(GMT +2)

我目前的代码:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime")); 

它有一个设置时区的方法:

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime")); 

全做完了!

所以你要通知UTC时区的SimpleDateFormat:

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); TimeZone utcZone = TimeZone.getTimeZone("UTC"); simpleDateFormat.setTimeZone(utcZone); Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime")); 

显示:

 simpleDateFormat.setTimeZone(TimeZone.getDefault()); String formattedDate = simpleDateFormat.format(myDate); 

您的stringmyUTC =“2016-02-03T06:41:33.000Z”

 SimpleDateFormat existingUTCFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); SimpleDateFormat requiredFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try{ Date getDate = existingFormat.parse(myUTC); String mydate = requiredFormat.format(getDate) } catch(ParseException){ } 
 public static String toLocalDateString(String utcTimeStamp) { Date utcDate = new Date(utcTimeStamp); DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); df.setTimeZone(TimeZone.getTimeZone("PST")); return df.format(utcDate); } 

干杯!

java.time

我想提出现代的答案。 大部分的其他答案是正确的,并在2011年是很好的答案。今天SimpleDateFormat已经过时了很久,它总是带有一些惊喜。 而今天我们有了更好的了: java.time也被称为JSR-310,现代Javadate和时间API。 这个答案适用于任何接受外部依赖的人(直到java.time进入你的Android设备)或已经在使用Java 8或更高版本。

  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); String dateTimeFromServer = "2011-05-18 16:35:01"; String localTimeToDisplay = LocalDateTime.parse(dateTimeFromServer, formatter) .atOffset(ZoneOffset.UTC) .atZoneSameInstant(ZoneId.of("Europe/Zurich")) .format(formatter); 

这个代码片段的结果是被要求的:

 2011-05-18 18:35:01 

如果可以,请给出明确的时区

我给了一个明确的欧洲/苏黎世时区。 请replace您所需的当地时区。 要依靠设备的时区设置,请使用ZoneId.systemDefault() 。 但是,请注意,这是脆弱的,因为它需要从JVM中进行时区设置,并且可以在您的程序的其他部分或运行在同一个JVM中的其他程序的脚本中更改设置。

在Android上使用java.time

我答应你一个外在的依赖。 要在Android上使用上面的,你需要ThreeTenABP,ThreeTen Backport的Android版本,JSR-310的后台端口到Java 6和7.如何去解决这个问题:如何在Android中使用ThreeTenABP项目 。

Date对象始终是以UTC为时间单位的毫秒数的包装。 它从来不代表当地时间。

这意味着你需要创build第二个SimpleDateFormatter来创build一个当地时间的显示string。

编辑:@Op。 请注意,Android上date/时间格式的优先级是java.text.DateFormat