我收到以下格式的UTC日期,以及如何将此UTC日期转换为我当地的时区?
我的输入日期是2015-03-17 06:00:00 +0000
,我尝试了以下编码,它给出了解析异常。
我的代码:
DateFormat utcFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss 'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2015-03-17 06:00:00 +0000"); // java.text.DateFormat.parse(Unknown Source)
utcFormat.setTimeZone(TimeZone.getDefault());
System.out.println(utcFormat.format(date));
答案 0 :(得分:3)
您的代码中有两个错误。
'
附近有Z
。dd-MM-yyyy
,但尝试将日期解析为yyyy-MM-dd
。正确版本:
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2015-03-17 06:00:00 +0000");
utcFormat.setTimeZone(TimeZone.getDefault());
System.out.println(utcFormat.format(date));
答案 1 :(得分:1)
我认为这是由日期模式中的引号引起的。
试试这个......
DateFormat utcFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss ZZZZ");
答案 2 :(得分:1)
删除'周围的Z并重试。
答案 3 :(得分:1)
我想提供现代答案。问题中使用的Date
和SimpleDateFormat
类已经过时了,今天我们已经好多了。我推荐现代Java日期和时间API,称为JSR-310或java.time
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss Z");
System.out.println(ZonedDateTime.parse("2015-03-17 06:00:00 +0000", formatter)
.withZoneSameInstant(ZoneId.systemDefault())
.format(formatter));
在欧洲/哥本哈根时区的计算机上打印
2015-03-17 07:00:00 +0100
但是,使用ZoneId.systemDefault()
是脆弱的,因为在JVM上运行的任何程序都可以更改其默认时区,从而改变上述代码段的行为。如果可以,最好使用 region / city 格式的时区ID,例如ZoneId.of("Asia/Tomsk")
或ZoneId.of("America/Argentina/Rio_Gallegos")
。
问题:我可以在Java版本中使用现代API吗?
如果至少使用Java 6 ,则可以。
答案 4 :(得分:0)
此函数经过测试,可与任何java.util.Date对象完美配合。
private SimpleDateFormat getDateFormat() {
SimpleDateFormat dateFormat = (SimpleDateFormat) SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.DEFAULT, Locale.getDefault());
String pattern = dateFormat.toLocalizedPattern();
pattern = pattern.trim();
dateFormat.applyLocalizedPattern(pattern);
return dateFormat;
}
//And here is the usage
SimpleDateFormat sdf = getDateFormat();
sdf.format(new Date());
我重构了以下网站中的代码,您可能会发现这些代码非常适合格式化为不同类型的java.util.Date对象:
希望这有帮助