在Kotlin Android中解析日期的正确方法(最小的Android版本21)。我的解析不工作

3 人关注

我想以这种格式解析这个日期 2021-11-03T14:09:31.135Z ( message.created_at )

My code is this:

val dateFormat = SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
var convertedDate = Date()
try {
    convertedDate = dateFormat.parse(message.created_at)
} catch (e: ParseException) {
    e.printStackTrace()

它未能解析出

2 个评论
SimpleDateFormat Date 是传统的Java时间API的一部分。替换代码2】是现代的替代品,是Java 8的一部分。在Android中,它只在 API 26级及以上 , but 它几乎可以完全用于早期版本,使用 API脱ugaring .请考虑改用 java.time 。它只是单纯的更好。
是的,其他人也在建议这样做。我将看一看。
java
android
date
kotlin
parsing
Suryakant Bharti
Suryakant Bharti
发布于 2021-11-16
5 个回答
Nitish
Nitish
发布于 2021-11-16
已采纳
0 人赞同

Don't use SimpleDateFormat it's long 过时的和麻烦的 .
使用 DateTimeFormatter 来解析日期。

 fun parseDate() {
        var formatter: DateTimeFormatter? = null
        val date = "2021-11-03T14:09:31.135Z" // your date string
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") // formatter
            val dateTime: ZonedDateTime = ZonedDateTime.parse(date, parser) // date object
            val formatter2: DateTimeFormatter =
                DateTimeFormatter.ofPattern("EEEE, MMM d : HH:mm") // if you want to convert it any other format
            Log.e("Date", "" + dateTime.format(formatter2))

Output:11月3日,星期三 : 14:09

要在安卓8以下使用这个,请使用脱脂

问题在前面的回答中已经解决了。谢谢你的帮助。
SuryakantBharti,这很好,但我还是建议你迁移到现代java api上--参考@deHarr或我的回答,你可以阅读一下 形成的原因是新的日期时间api ,Arwind Kumar的回答,或者谷歌搜索可能会给你更多的理由。
非常感谢。我将研究一下。
这绝对是在使用最现代的API。我只是认为将 Z 作为一个字面的方法,通过单引号来转义,虽然这意味着 UTC 这是一个相当大的漏洞。替换代码1】明确表示日期和时间加偏移量,这在类 OffsetDateTime 中得到反映,而在 LocalDateTime 中只是部分反映,它并不包含关于区域的信息。如果你真的需要一个 LocalDateTime ,你可以随时从 OffsetDateTime 的实例中调用 toLocalDateTime()
MC Emperor
MC Emperor
发布于 2021-11-16
0 人赞同

嗯,格式不完全是字符串的样子。

  • You have a space instead of the T literal between the date and the time
  • You have no offset notation at the end
  • You are using hh , which is 12-hour format. Use HH instead.
  • 这种格式应该可以做到。

    yyyy-MM-dd'T'HH:mm:ss.SSSX
    

    然而,请注意,DateSimpleDateFormat已经过时,并且troublesome.使用java.time代替。如果你的Android API级别似乎太低,你可以使用三联书店.

    Yes, will consider the suggestion.
    Future Deep Gone
    Future Deep Gone
    发布于 2021-11-16
    0 人赞同

    try it

    fun main() { val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS") var convertedDate = Date() try { convertedDate = dateFormat.parse("2021-11-03T14:09:31.135Z") println(convertedDate) } catch (e: ParseException) { e.printStackTrace()
    deHaar
    deHaar
    发布于 2021-11-16
    0 人赞同

    如果你的最低API级别是21,你可以使用 API解ugaring 找到一些关于它的很好的解释 here .

    As soon as you have enabled API解ugaring, you can directly parse your ISO String to an OffsetDateTime :

    val convertedDate = OffsetDateTime.parse(message.created_at)
        
    问题在前面的回答中已经解决了。谢谢你的帮助。
    Rohan Shinde
    Rohan Shinde
    发布于 2021-11-16
    0 人赞同

    你刚刚错过了日期格式字符串中的 "T"。使用这个解决方案来进行日期解析。

    fun formatDate(inputDate: String) {
        var convertedDate = Date()
        val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZ", Locale.getDefault())
        try {
            convertedDate = dateFormat.parse(inputDate)
            print("Parsed date $convertedDate")
        } catch (ignored: ParseException) {
        //if you wish to change the parsed date into another formatted date
        val dfOutput = SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault())
        val str :String = dfOutput.format(convertedDate)
        print("Formatted date $str")