如何在 Kotlin 中获取当前日期和时间的 ISO 8601 格式?

3
我正在尝试以ISO 8601格式获取当前日期和时间。下面的代码返回14天后的日期和错误的时间。我需要正确的格式和当前日期来进行API请求。
val formatter = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").apply {
        this.timeZone = TimeZone.getTimeZone("CST")
    }

val now = Calendar.getInstance(TimeZone.getTimeZone("CST"))

val sendDateUAT = formatter.format(now.time)
Log.d(TAG, "sendDate: $sendDateUAT")

这将返回:2019-08-05T02:53:40Z

编辑:现在为:

java.util.GregorianCalendar[time=1564973620006,areFieldsSet=true,lenient=true,zone=GMT,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=7,WEEK_OF_YEAR=32,WEEK_OF_MONTH=2,DAY_OF_MONTH=5,DAY_OF_YEAR=217,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=53,SECOND=40,MILLISECOND=6,ZONE_OFFSET=0,DST_OFFSET=0]

1
无法在本地重现。您在哪里执行此代码?我怀疑时钟不正确。 - Phil
@HoratiusCocles,我刚刚更新了我的问题并附上了now.time的结果。 - QThompson
此外,考虑丢弃过时且出了名的麻烦的 SimpleDateFormat 及其相关类,并在 Android 项目中添加 ThreeTenABP,以使用现代 Java 日期和时间 API java.time。它的使用体验优美无比。 - Ole V.V.
2
1564973620006是GMT时间:2019年8月5日星期一02:53:40.006。看起来这个时间是你提问时的正确时间,但日期却比现在多了两周。另外,MONTH=7表示八月(呃!),而你的DAY_OF_MONTH=5 - Ole V.V.
我找到了解决方案,不确定它与上面的代码有多大的区别,但它确实有效。感谢所有的输入。 - QThompson
显示剩余4条评论
2个回答

1
这里有一个辅助类可以帮助您转换日期:

public object DateHelper {
    private const val ISO_8601_24H_FULL_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

    @JvmName("toIsoStringNullable")
    fun Date?.toIsoString(): String? {
        return this?.toIsoString()
    }

    fun Date.toIsoString(): String {
        val dateFormat: DateFormat = SimpleDateFormat(ISO_8601_24H_FULL_FORMAT)
        return dateFormat.format(this)
    }
}

它可以非常简洁地使用,就像这样:

Date().toIsoString()

-1

出于某种原因,这解决了问题并返回了正确的日期。

val today = Calendar.getInstance()
val sendDateUAT = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(today.time)

4
感谢您回答自己的问题。但是,回答并不正确。Z是一个偏移量(距UTC 0),因此将其附加到可能具有(通常具有)不同偏移量的日期和时间会得出不正确的结果。 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接