Android中输入的日期解析异常Mon, 11 Sep 2023 15:49:32 GMT

Date Parse Exception in Android for input Mon, 11 Sep 2023 15:49:32 GMT

提问人:MARSH 提问时间:9/12/2023 最后编辑:AnonymousMARSH 更新时间:10/9/2023 访问量:146

问:

 fun calculateAge(dateString: String): String {
        val dateFormat = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z")
        dateFormat.timeZone = TimeZone.getTimeZone("GMT")
        val inputDate = dateFormat.parse(dateString)
        val currentCalendar = Calendar.getInstance()
        val inputCalendar = Calendar.getInstance()
        inputCalendar.time = inputDate
        val years = currentCalendar.get(Calendar.YEAR) - inputCalendar.get(Calendar.YEAR)
        val months = currentCalendar.get(Calendar.MONTH) - inputCalendar.get(Calendar.MONTH)
        val days = currentCalendar.get(Calendar.DAY_OF_MONTH) - inputCalendar.get(Calendar.DAY_OF_MONTH)

        return when {
            years > 0 -> "$years years "
            months > 0 -> "$months months"
            else -> "$days days"
        }
    }

我的日期输入是:Mon, 11 Sep 2023 15:49:32 GMT

我收到此异常:java.text.ParseException:无法解析的日期:“Mon, 11 Sep 2023 15:49:32 GMT”

这是一段使用它的代码,我正在尝试计算年龄,它在 android 中的 API 级别 33 之前工作正常,但是当我尝试使用 API 级别 34 运行代码时,我在 android 中出现解析异常,任何人都可以帮助我如何解决这个问题。

Android Kotlin 日期时间 简单日期格式 datetime-parsing

评论

0赞 Anonymous 9/15/2023
我建议您使用 java.time(现代 Java 日期和时间 API)来处理日期工作。、 和 早已过时。十年前,它们被 java.time 取代,因为使用它们存在无穷无尽的问题。SimpleDateFormatTimeZoneDateCalendar
0赞 Anonymous 9/15/2023
我为您的问题添加了更多标签。到目前为止,缺乏回应的部分原因可能是人们没有看到你的问题,因为标签不存在。我交叉手指,现在还不算太晚。
0赞 Anonymous 9/15/2023
要使用 java.time 进行解析,请使用 .您的格式与格式化程序指定的内容一致。用于计算年龄使用。它还会给你一个比你从代码中得到的更准确的结果。OffsetDateTime.parse(dateString, DateTimeFormatter.RFC_1123_DATE_TIME)Period.between()
0赞 Anonymous 9/15/2023
请参阅在 JAVA 中解析 RFC 2822 日期。只答应我,为了你的理智,你忽略了使用 .SimpleDateFormat
0赞 Anonymous 9/16/2023
这回答了你的问题吗?收到错误 java.text.ParseException: Unparseable date: (at offset 0),即使简单日期格式和字符串值相同还是这个?DateTimeFormatter 无法解析 JDK 17 中的日期,其中 as 在 JDK8 中传递 [closed]

答:

2赞 Arvind Kumar Avinash 10/9/2023 #1

java.time(java时间)

2014 年 3 月,新式日期时间 API 取代了旧日期时间 API。从那时起,强烈建议切换到 ,即现代日期时间 API。java.time

日期时间字符串符合DateTimeFormatter.RFC_1123_DATE_TIME格式。您可以从 中获取日期部分 (),这是使用此解析给定日期时间字符串的结果。LocalDateOffsetDateTimeDateTimeFormatter

获取 UTC 的当前时间,然后使用 Period#between 查找这两个日期之间的时间段。LocalDate

var strDateTime = "Mon, 11 Sep 2023 15:49:32 GMT";
var dateFrom = OffsetDateTime.parse(strDateTime, DateTimeFormatter.RFC_1123_DATE_TIME)
               .toLocalDate();
var dateUntil = LocalDate.now(ZoneOffset.UTC);
var period = Period.between(dateFrom, dateUntil);
System.out.println(period);

// Formatted
System.out.println(formattedPeriod(period));

其中 是一个函数,返回以您想要的方式格式化的函数。formattedPeriod(Period)String

String formattedPeriod(Period period) {
    var years = period.getYears();
    var months = period.getMonths();

    return years > 0 ? years + " years" : months > 0 ? months + " months" : period.getDays() + " days";
}

输出:

P27D
27 days

在线演示

Trail: Date Time 了解现代日期时间 API

注意:我的专业领域是Java,因此我使用Java语言编写了代码。Kotlin 支持按原样运行 Java 代码。Kotlin 程序员可以轻松地将 Java 代码转换为相应的 Kotlin 代码。此外,我的大部分代码都可以在相应的 Kotlin 程序中重复使用。

更新

由于您的日期时间字符串是 GMT/UTC 格式,因此我曾经以 GMT/UTC 格式获取当前数据,即关键是使用与数据时间字符串相同的时区偏移量获取当前值。LocalDate.now(ZoneOffset.UTC)LocalDateLocalDate

正如 Ole V.V. 所评论的,您可以显式地将时区偏移量应用于解析的日期时间和当前 .他还使用他的方法提供了指向 Kotlin 解决方案的链接。这是使用他的方法在 Java 中编写代码的链接。LocalDate

评论

1赞 Anonymous 10/9/2023
由于字符串可能包含任何 UTC 偏移量,因此在我的代码中,我将解析的时区转换为默认时区,并在那里进行年龄计算。使用示例字符串,您可以获得 GMT 或 UTC 中的两个日期(为此目的相同),但我想确保始终使用相同的时区。提到可能的灵感。OffsetDateTime