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,那么测试就成功了
相关的
- 完整的源代码:
表示Unicode CLDR项目提供的区域设置数据CLDR
表示当前用户对基础操作系统设置的自定义。它只适用于用户的 默认语言环境,可自定义的设置可能会因环境而异 操作系统。但是,主要是日期、时间、数量和 支持货币格式HOST
表示由已安装的服务提供程序接口(SPI)提供程序实现的地区敏感服务SPI
(以前称为COMPAT
)表示与JDK 9之前的版本兼容的语言环境数据<代码>JRE仍然可以用作 值,但首选JRE
COMPAT
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");