Java 在android中将UTC时间格式解析为可读的日期时间
我有一个UTC日期时间,格式为Java 在android中将UTC时间格式解析为可读的日期时间,java,android,utc,datetime-parsing,Java,Android,Utc,Datetime Parsing,我有一个UTC日期时间,格式为2019-12-06T06:04:50.022461Z我想转换成可读的日期时间,格式为dd-mm-yyyy-hh:mm:ss。我无法转换为特定格式。我们将非常感谢您的帮助。谢谢您可以在java 8中尝试此功能 String dateString = "2019-12-06T06:04:50.022461Z"; DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZ
2019-12-06T06:04:50.022461Z
我想转换成可读的日期时间,格式为dd-mm-yyyy-hh:mm:ss
。我无法转换为特定格式。我们将非常感谢您的帮助。谢谢您可以在java 8中尝试此功能
String dateString = "2019-12-06T06:04:50.022461Z";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);
TemporalAccessor date = fmt.parse(dateString);
Instant time = Instant.from(date);
DateTimeFormatter fmtOut = DateTimeFormatter.ofPattern("dd-mm-yyyy hh:mm:ss").withZone(ZoneOffset.UTC);
String newDateString = fmtOut.format(time);
您可以使用
SimpleDateFormat
格式化日期。检查以下内容:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse("2019-12-06T06:04:50.022461Z"));
} catch (Exception ex) {
ex.printStackTrace();
}
SimpleDateFormat returnFormat = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
returnFormat.format(calendar.getTime());
java.time和ThreeTenABP
我假设您希望在用户的时区中显示时间。正如您已经说过的,您的字符串是UTC格式的,很少有用户愿意以UTC格式读取时间
DateTimeFormatter readableFormatter = DateTimeFormatter.ofPattern("dd-MM-uuuu HH:mm:ss");
String originalString = "2019-12-06T06:04:50.022461Z";
String readableString = Instant.parse(originalString)
.atZone(ZoneId.systemDefault())
.format(readableFormatter);
System.out.println(readableString);
为了这个例子,我在美国/锡特卡时区运行了这段代码。产出为:
2019年5月12日21:04:50
如果确实希望以UTC显示原始字符串中的时间:
String readableString = OffsetDateTime.parse(originalString)
.format(readableFormatter);
2019年6月12日06:04:50
不要使用当前接受答案中使用的SimpleDateFormat
、TimeZone
和Calendar
类。它们都设计得很糟糕,SimpleDataFormat
尤其是一个臭名昭著的麻烦制造者,而且不能像在字符串中那样在秒上解析6个小数。这三门课也早已过时。相反,我使用的是java.time,现代java日期和时间API。和你一起工作真是太好了。代码不仅更短,我想你也会发现读起来更清晰(要么马上读,要么习惯了流畅的风格)
我正在利用您的原始字符串是ISO 8601格式这一事实。time的类将ISO 8601格式解析为默认格式,也就是说,不使用任何显式格式化程序
但是,对于绝大多数情况,您不应该希望从一种字符串格式转换为另一种字符串格式。在程序中,将日期和时间作为即时对象或其他适当的日期/时间对象保存。仅当接口中需要字符串时才转换为字符串
问:java.time不需要Android API级别26吗?
time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
- 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
org.threeten.bp
导入日期和时间类
链接
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口
到Java6和Java7(JSR-310为三十)
请不要教年轻人使用早已过时且臭名昭著的
SimpleDateFormat
类。至少不是第一个选择。而且不是毫无保留的。今天,我们在及其DateTimeFormatter
中有了更好的功能。是的,你可以在Android上使用它。对于较旧的Android,请参见。您的代码在我的时区中生成06-04-2019 07:04:50
。月份应为12月,但已更改为4月。您的代码为我提供了java.time.format.DateTimeParseException:无法解析文本“2019-12-06T06:04:50.022461Z”,未解析文本位于索引10
。使用现代java日期和时间API java.time是一个好主意。@OleV.V。为什么不给出示例代码来解析它呢。Thanks@Piyush我一直在犹豫是否这样做,因为这是一个糟糕的问题,也是许多其他问题的重复。因此,我首先在评论中提供了一些链接。现在我已经按照你的要求发布了我的答案。@OleV.V。谢谢你提供的信息!!你的回答这回答了你的问题吗?有成千上万的问题(字面上)似乎与你的问题有关,因此在提出新问题之前,请至少浏览其中的前20个问题。请告诉我们你的搜索和研究结果,并向我们展示你的尝试是如何失败的,例如,你得到了什么其他格式。我认为您正在尝试的任务有两个非常重要的问题:(1)如何解析尾随z
(您的字符串是ISO8601格式)的ISO8601字符串。(2) 如何解析秒数为6位小数的字符串,因为SimpleDataFormat
无法做到这一点。有答案也有答案。