当区域设置为阿拉伯语时,来自 UTC 日历错误的 SimpleDateFormat

SimpleDateFormat from UTC Calendar Error when Locale is Arabic

我正在尝试将时间戳转换为日期,然后将其放入请求的查询参数中。

这是将时间戳转换为日期的函数:

override fun fromTimestamp(timestamp: Long): String {
    val tz = TimeZone.getTimeZone("UTC")
    val calendar = Calendar.getInstance(tz)
    calendar.timeInMillis = timestamp

    // Quoted "Z" to indicate UTC, no timezone offset
    val df = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    df.timeZone = tz

    return df.format(calendar.time)
}

当我的设备设置为英文时,这似乎工作得很好,在对日期进行 URL 编码后,参数中显示的是:1970-01-01T00%3A00%3A00.000Z

现在,如果我的设备设置为阿拉伯语,URL 编码日期如下所示:%D9%A2%D9%A0%D9%A1%D9%A8-%D9%A1%D9%A0-%D9%A1%D9%A7T%D9%A1%D9%A9%3A%D9%A4%D9%A7%3A%D9%A1%D9%A9.%D9%A0%D9%A8%D9%A2Z

我只能假设所有这些被编码为整数的字符都是描述日期的阿拉伯字符

谷歌搜索后,我发现 this discussion 说要使用来自美国的区域设置初始化日历。但是查看上面的代码,您会注意到日历正在使用 UTC 时区进行初始化。

我认为从 UTC 时区实例化的日历会踢出整数而不是描述整数的特定语言的字符,但我不完全确定 Android 系统如何处理它。

关于如何修改我的函数以用整数表示日历日期(无论区域设置如何)的任何想法?

我的赌注是

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US)