Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Kotlin 如何稳定校准数据时间测试的片状时间格式?_Kotlin_Date Formatting_Date Comparison_Threetenbp_Datetimeformatter - Fatal编程技术网

Kotlin 如何稳定校准数据时间测试的片状时间格式?

Kotlin 如何稳定校准数据时间测试的片状时间格式?,kotlin,date-formatting,date-comparison,threetenbp,datetimeformatter,Kotlin,Date Formatting,Date Comparison,Threetenbp,Datetimeformatter,给定以下基于的日期格式化程序: class DateFormatter private constructor() { private val dateShortTimeShortFormatter = org.threeten.bp.format.DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT, FormatStyle.SHORT) fun getFormattedD

给定以下基于
的日期格式化程序

class DateFormatter private constructor() {

    private val dateShortTimeShortFormatter = 
        org.threeten.bp.format.DateTimeFormatter.ofLocalizedDateTime(
            FormatStyle.SHORT, FormatStyle.SHORT)

    fun getFormattedDateTimeShort(time: Long): String {
        return dateShortTimeShortFormatter.withZone(ZoneId.systemDefault())
                                          .format(Instant.ofEpochMilli(time))
    }

    /* ... */
}
我正在GNOME终端shell(
LANG=en_US.UTF-8
)中对Ubuntu 20.04运行以下测试:

它成功了


当我在Android Studio 4.2 Beta 3或Android Studio 2020.3.1 Canary 4中运行它时,会失败,出现以下错误:

org.junit.ComparisonFailure:
预计:“1919年1月22日凌晨1:00”
实际:“19年1月22日,凌晨1:00”

截至2021年1月16日的爪哇新闻 根据OLEV.V.的评论和回答,我发现测试在shell中的行为因Java版本而异。Gradle拿起
JAVA\u HOME
——因此我需要更新环境变量。请注意,通过
sudo update alternations--config java
将符号链接更改为
java
可执行文件无效

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

-> Test succeeds

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

-> Test fails

export JAVA_HOME=/usr/lib/jvm/java-14-openjdk-amd64

-> Process 'Gradle Test Executor 1' finished with non-zero exit value 134
Java/JRE 9不适用于此Ubuntu版本

解决方案:Android Studio中的Java/JDK 在IDE中,我还可以通过
文件>项目结构…>SDK位置

一旦我从预先配置的JDK 11(在IDE的安装文件夹中)更改为JDK 8,那么测试就成功了

相关的
  • 完整的源代码:
区域设置数据 日期和时间格式位于区域设置数据中。因此,您的Android Java和Ubuntu上的Java中有不同的语言环境数据。Java可以从不同的来源获取其语言环境数据,并且您可以在某种程度上控制这些数据

我在Three-Ten Backport和Java 9上运行了这个(请原谅我的Java):

产出为:

19年1月22日凌晨1:00

这在日期和时间之间有一个逗号,与您在Android Studio中得到的一致

但恐怕成功的故事到此为止。我在想,如果您接受逗号,您可以在两种环境中生成它,并且您的测试将通过。但我在Java8或更低版本上尝试产生相同的行为,但没有成功

桌面Java最多可从四个来源获取其区域设置数据:

语言环境数据有四个不同的来源,由 以下关键词:

  • CLDR
    表示Unicode CLDR项目提供的区域设置数据
  • HOST
    表示当前用户对基础操作系统设置的自定义。它只适用于用户的 默认语言环境,可自定义的设置可能会因环境而异 操作系统。但是,主要是日期、时间、数量和 支持货币格式
  • SPI
    表示由已安装的服务提供程序接口(SPI)提供程序实现的地区敏感服务
  • COMPAT
    (以前称为
    JRE
    )表示与JDK 9之前的版本兼容的语言环境数据<代码>JRE仍然可以用作 值,但首选
    COMPAT
Java 9中的默认值相当于
CLDR、COMPAT、SPI
(CLDR用于公共语言环境数据存储库)。因此,理论上,我应该能够通过使用以下设置在Java 8中获得相同的语言环境数据:

    System.setProperty("java.locale.providers", "CLDR,COMPAT,SPI");
但没有:

19年1月22日凌晨1:00

这里没有逗号。它符合你的期望,似乎已经在你的Ubuntu上实现了。我所知道的解释是,CLDR也有不同的版本,因此我推测与Java8捆绑的CLDR版本与Java9中的版本不同

我不是Android开发者。我不知道Android从何处获得其区域设置数据,也不知道您是否可以控制它。您可能想去搜索选项

当然,如果你可以将Ubuntu上的Java升级到Java9或更高版本,那么你的行为似乎与Android Studio一致

<>或者你可以考虑放弃测试确切的格式。语言环境数据被输入到程序中,而不是程序的一部分,单元测试输入最终没有意义,这在术语上是矛盾的

链接
通过JDK 9中的国际化增强,您是否绝对确定这两个JVM运行的是相同的语言环境?不确定短格式的实际定义位置,但
actual
中日期和时间之间的逗号似乎表明运行时区域设置存在差异。我认为我可以通过调用
locale.setDefault()
,在执行测试时控制区域设置,因此底层系统设置为哪个区域设置并不重要。不过,在两个运行时上检查
DateFormatter#dateShortTimeShortFormatter
应该很有意思。您在Ubuntu上使用的是哪个Java版本?Android Studio 2020.3.1 Canary 4指向嵌入式JRE 11.0.8。在shell中,我使用OpenJDK1.8.0_275。感谢您的解释。我发现测试确实成功/失败取决于Java版本。请看我在我的帖子中添加的内容。我在上面也解释了如何在Android Studio中通过测试。再次非常感谢。
    Locale.setDefault(Locale.US);
    System.setProperty("user.timezone", "GMT+01:00");
    
    DateTimeFormatter dateShortTimeShortFormatter
            = org.threeten.bp.format.DateTimeFormatter.ofLocalizedDateTime(
                    FormatStyle.SHORT, FormatStyle.SHORT);
    
    String text = dateShortTimeShortFormatter.withZone(ZoneId.systemDefault())
            .format(Instant.ofEpochMilli(1548115200000L));
    
    System.out.println(text);
    System.setProperty("java.locale.providers", "CLDR,COMPAT,SPI");