提问人:MARSH 提问时间:9/12/2023 最后编辑:AnonymousMARSH 更新时间:10/9/2023 访问量:146
Android中输入的日期解析异常Mon, 11 Sep 2023 15:49:32 GMT
Date Parse Exception in Android for input Mon, 11 Sep 2023 15:49:32 GMT
问:
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 中出现解析异常,任何人都可以帮助我如何解决这个问题。
答:
java.time(java时间)
2014 年 3 月,新式日期时间 API 取代了旧日期时间 API。从那时起,强烈建议切换到 ,即现代日期时间 API。java.time
日期时间字符串符合DateTimeFormatter.RFC_1123_DATE_TIME
格式。您可以从 中获取日期部分 (),这是使用此解析给定日期时间字符串的结果。LocalDate
OffsetDateTime
DateTimeFormatter
获取 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)
LocalDate
LocalDate
正如 Ole V.V. 所评论的,您可以显式地将时区偏移量应用于解析的日期时间和当前 .他还使用他的方法提供了指向 Kotlin 解决方案的链接。这是使用他的方法在 Java 中编写代码的链接。LocalDate
评论
OffsetDateTime
评论
SimpleDateFormat
TimeZone
Date
Calendar
OffsetDateTime.parse(dateString, DateTimeFormatter.RFC_1123_DATE_TIME)
Period.between()
SimpleDateFormat