将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