Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 从ISO日期时间字符串构造本地化的日期字符串_Java_Android_Datetime Format - Fatal编程技术网

Java 从ISO日期时间字符串构造本地化的日期字符串

Java 从ISO日期时间字符串构造本地化的日期字符串,java,android,datetime-format,Java,Android,Datetime Format,我有一个要求,我需要在Android布局的文本视图上呈现本地化的datetime。日期时间以ISO格式从服务调用返回。下面是JSON的响应 { "expiredTime": "2020-01-24T00:59:59.000-05:00", . . . Other Keys and Values . . . } 这将在文本视图中的Android应用程序中呈现。我想做的是在应用程序上显示本地化时间。因此,如果用户在屏幕上查看(比如纽约),过期时间将显示2020-01-24T00:59:5

我有一个要求,我需要在Android布局的文本视图上呈现本地化的datetime。日期时间以ISO格式从服务调用返回。下面是JSON的响应

{
   "expiredTime": "2020-01-24T00:59:59.000-05:00",
  . . . Other Keys and Values . . .
}
这将在文本视图中的Android应用程序中呈现。我想做的是在应用程序上显示本地化时间。因此,如果用户在屏幕上查看(比如纽约),过期时间将显示
2020-01-24T00:59:59.000-05:00
,因为有效负载中的时间与纽约属于同一时区。类似地,如果我想以GMT显示,时间将显示为
2020-01-24T05:59:59.000-00:00

我如何在Android中正确实现这一点?我这样做如下所示。返回的日期被传递到
simpleDataFormat
实例以返回字符串

public static final Date parse(String dateTimeAsString) throws ParseException
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME.withLocale(Locale.getDefault()));
            try
            {
                LocalDate localDate = LocalDate.parse(value, formatter);
                if (localDate != null)
                    return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
            } catch (DateTimeParseException dtpe)
            {
                // If the format is invalid, then delegate to the other helper function.
            }
        }
        return null;
    }
我的问题如下:

  • 我的实现是为了获得正确的本地化日期吗?如果没有,我将如何正确执行
  • 我如何定位Oreo以下Android操作系统版本的日期?DateTimeFormatter仅在Android Oreo及以上版本中可用
  • 示例用法:

        String expiredTime = "2020-01-24T00:59:59.000-05:00";
        System.out.println(parse(expiredTime));
    
    我的时区中的输出:

    2020-01-24T06:59:59+01:00[欧洲/哥本哈根]

    关于您的问题:

  • 我的实现是为了获得正确的本地化日期吗?如果没有,我将如何正确执行
  • 不,您的实现有几个问题。不过,我对使用java.time(现代java日期和时间API)表示赞赏

    • 返回
      日期
      不会给出任何特定时区的时间。
      日期
      没有时区。这只是一个时间点
    • 一个
      LocalDate
      是一个没有时间的日期,所以当使用这个类时,你会丢失时间部分
    • 不重要的是,
      DateTimeFormatter.ISO\u DATE\u TIME
      在所有区域设置中都是相同的,因此对其应用区域设置没有任何区别
  • 我如何定位Oreo以下Android操作系统版本的日期?DateTimeFormatter仅在Android Oreo及以上版本中可用
  • 使用后端口。time已经从Java8向后移植到Java6和Java7,并且该后端口进一步适应早期的Android API级别。请参阅下面的链接。如果您正在编写一个在多个OS版本上受支持的应用程序,我建议您只需始终使用backport(backport也适用于高API级别)。我为backport编写了上面的代码,所以它可以工作。(我希望它也能在内置类上工作,而不是经过测试)

    用法说明:在计算中,本地化通常意味着适应用户的语言(部分是他们的文化)、他们所谓的地区,而不是他们的时区。地区和时区是正交的概念

    链接
    • ,其中首先描述了
      java.time
    • ,java.time的后端口到Java6和Java7(JSR-310为三十)
    • ,Android版Three Ten Backport
    • ,解释得非常透彻
    • 关于维基百科

    您实际上是在一个问题中提出了两个问题:(1)如何解析ISO 8601格式?(2) 如何根据用户的时区显示日期?每个问题之前都有人问过,也有人回答过,所以你的搜索引擎就是你的朋友。当你说本地化时,你的意思是根据用户的时区或文化,还是两者都有?在法国的法国用户的输出应该是
    2020-01-24T06:59:59.000+01:00
    还是类似于
    2020年1月24日
    ?@OleV.V。基本上在本地时区以长日期格式显示日期。例如,在美国显示为MM-DD-YY hh:MM:ss Z,但在欧洲显示为DD-MM-YY hh:MM:ss Z。我认为您可以从以下问题中获得一些信息:。仅因为UTC偏移量
    -05:00
    中有冒号,所以不需要格式化程序,因为您的格式是
    OffsetDateTime
    的默认格式。使用OffsetDateTime.parse(“2020-01-24T00:59:59.000-05:00”)进行解析应该可以。你也可以搜索更有用的问题。
        String expiredTime = "2020-01-24T00:59:59.000-05:00";
        System.out.println(parse(expiredTime));