Android 为什么Calendar.getDisplayName在给定毫秒时总是返回一周中的同一天?

Android 为什么Calendar.getDisplayName在给定毫秒时总是返回一周中的同一天?,android,kotlin,calendar,Android,Kotlin,Calendar,我试图创建一个扩展方法来确定一周内的一天的名称,给定一个特定的Long值,以便返回星期一、星期二等 fun Long.convertFromLongToDayOfWeek(): String { val calendar = Calendar.getInstance() calendar.timeInMillis = this return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Lo

我试图创建一个扩展方法来确定一周内的一天的名称,给定一个特定的Long值,以便返回星期一、星期二等

fun Long.convertFromLongToDayOfWeek(): String {

    val calendar = Calendar.getInstance()

    calendar.timeInMillis = this

    return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault()) ?: ""
}
但是,不管我传递给calendar实例的值是多少,它总是返回“Monday”

我已经编写了一些带有长值的单元测试(我从一个API收到),它们都在周一返回。要使用的测试值包括以下各项:

  • 1601542800
  • 1601715600
  • 1601629200
这段代码是完整的,到目前为止,以下单元测试只是为了简化调试:



这两个测试都通过了,但这两个长值都不代表星期一,我做错了什么?

这些都是星期一!它们实际上都是同一个星期一,一天有86400000毫秒,这些值之间只有几百秒的间隔


如果你从API中获得的时间戳是以秒为单位的,那么你需要将它们乘以1000得到毫秒(日历设置程序就是这样做的)

这些都是星期一!它们实际上都是同一个星期一,一天有86400000毫秒,这些值之间只有几百秒的间隔


如果您从API中获取以秒为单位的时间戳,则需要将它们乘以1000以获得毫秒(这是日历设置程序所采用的)

这真的很奇怪,不应该是这样。以防万一,你有没有像PowerMock这样疯狂的模拟工具,可以让你模拟静态功能?@EugenMartynov测试只是为了加快开发速度,当我在手机上运行它时,它也会重现这个问题,这就是它开始的地方。这真的很奇怪,不应该是这样。以防万一,你有没有像PowerMock这样疯狂的模拟工具,可以让你模拟静态函数?@EugenMartynov测试只是为了更快的开发,当我在手机上运行它时,它也会重现这个问题,这就是它开始的地方我也在使用epochconverter.com来验证这些值,还请注意,这些是我从api收到的日期,它们应该是来自不同日期的日期。站点假设时间戳为秒。如果您从api获得的时间戳为秒,则需要将它们乘以1000以获得毫秒(这是
日历
setter需要的),我假设最简单的答案是正确的,让我测试一下,然后再给你回复,谢谢,可能是个愚蠢的问题。不,我们的大脑不习惯处理这么大的数字,所以很难判断它是否正确。我们都做到了!我也在使用epochconverter.com来验证这些值,请注意,这些是我从api收到的日期,它们应该是不同日期的日期。该站点假设时间戳为秒。如果你从api获得的时间戳是秒,你需要将它们乘以1000,得到毫秒(这就是《日历》设定者所需要的)很酷,我假设最简单的答案是正确的,让我测试一下,然后再给你回复,谢谢,可能是个愚蠢的问题。不,我们的大脑不习惯处理这么大的数字,所以很难判断它是否正确。我们都做过!
   @Test
    fun testExample1() {

    val value: Long = 1601542800

    val result = value.convertFromLongToDayOfWeek()

    Assert.assertEquals("Monday", result)

    }

    @Test
    fun testExample2() {

    val value: Long = 1601715600

    val result = value.convertFromLongToDayOfWeek()

    Assert.assertEquals("Monday", result)

   }