java - SimpleDateFormat 未在单元测试中返回预期值

标签 java android android-studio unit-testing kotlin

我有一个从给定日期中提取确切时间的逻辑(例如: 12:00 PM )。
在逻辑的最后,我使用了 SimpleDateFormat解析日期。
当我在 Android 设备上运行代码时,一切正常。
此外,当我在 MacBook、Windows 操作系统和 Bitbucket 管道上运行单元测试时,所有测试都通过了。
但是,当我在 MacBook M1-pro 2021 上运行单元测试时使用相同的 Android 工作室和代码库,其中一项测试失败。
这是格式化日期的代码部分:

val output = SimpleDateFormat("hh:mm a")
return output.format(date)
预期结果类似于 12:00 PM在我提到的那些场景中,这完全没问题。
this is the UI on my Android device:
但是在 MacBook M1-pro 2021测试失败,因为格式化程序返回 12:00 p.m. :
expected: 12:00 PM
but was : 12:00 p.m.
This is the result of the unit test on MacBook M1-pro 2021

最佳答案

我猜您隐含地依赖于 JVM 当前的默认语言环境,并且该语言环境因您的各种测试环境而异。
或者您正在使用具有不同语言环境规则定义的不同版本的 Java 或 Android。
而且,另一个问题:您正在使用糟糕的日期时间类,这些类在几年前被 JSR 310 中定义的现代 java.time 类所取代。
java.time 类与 Java 8+ 和 Android 26+ bundle 在一起。对于早期的 Android,使用最新的工具通过“API 脱糖”提供大部分 java.time 功能。
转换您的遗产 java.util.Date类到它的替换java.time.Instant通过调用添加到旧类的新转换方法。

Instant instant = myJavaUtilDate.toInstant() ;
调整到您想要的时区。
ZoneId z = ZoneId.of( "America/Edmonton" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
提取时间部分,即问题的焦点。
LocalTime lt = zdt.toLocalTime() ;
自动本地化输出。指定 Locale明确地。 Locale确定在本地化中应用的人类语言和文化规范。
Locale locale = Locale.CANADA ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT ).withLocale( locale ) ;
String output = lt.format( lt ) ;
请注意 Java 9 changed its default behaviorCommon Locale Data Repository (CLDR) 中使用更丰富的语言环境定义集由 Unicode 联盟提供。此更改可能会导致一些差异,例如您的 AM/PM 格式。此外,CLDR 数据还在不断发展,因此以后的版本可能会更改一些规则。
Android可能也改变了不同版本的规则,但我不知道那里的历史。
我建议您不要担心本地化格式的细微差别。但如果你坚持,那么你需要:
  • Locale 的控制您的代码隐式或显式依赖于它。
  • 控制语言环境规则/定义的来源和版本
    Locale 使用.
  • 关于java - SimpleDateFormat 未在单元测试中返回预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71447143/

    相关文章:

    android - 如何在不对 Activity 类进行硬编码的情况下从服务库中的 Notification 启动主 Activity

    android - Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    android - 应用被拒绝,因为可以在屏幕关闭时播放YouTube视频

    java - JUnit 在没有 @BeforeEach 的情况下创建该类的新实例?

    android - SQLite 游标在内部是如何工作的?

    java - 如何根据java中的模式生成随机数/字符串?

    Android:从 Android 代码获取 APKs minSdkVersion

    java - 翻译为 Kotlin 时,我是否应该更新我的 java 文件以命名为 kotlin?

    java - 如何获得以像素为单位的 View 之间的距离?

    java - 我无法在主类中获取 JPanel 的背景颜色