Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中将UTC时间格式解析为可读的日期时间_Java_Android_Utc_Datetime Parsing - Fatal编程技术网

Java 在android中将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

我有一个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").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为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 请不要教年轻人使用早已过时且臭名昭著的
    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
    无法做到这一点。有答案也有答案。