SimpleDateFormat 创建 4 位数的月份

SimpleDateFormat creating 4 digit month

提问人:Jeff 提问时间:5/14/2019 最后编辑:Jeff 更新时间:5/14/2019 访问量:267

问:

我们的代码与下面的代码非常相似,其中我们获取 java.util.Date 并从日期中减去一定的秒数,并将其作为字符串存储在 sqlite 数据库中:

private static final String DB_DATE_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ssZ"
SimpleDateFormat DATE_FORMAT_NO_MS = new SimpleDateFormat(DB_DATE_FORMAT_STRING, Locale.US);

String dateToString(java.util.Date date date) { 
    return DATE_FORMAT_NO_MS.format(date);
}

然后稍后我们在 java 8 DateTimeFormatter 中使用相同的字符串来制作 Java 8 OffsetDateTime:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DB_DATE_FORMAT_STRING);
OffsetDateTime odt = eventData.setDateReceived(OffsetDateTime.parse(dateString, eventDbTimeFormatter));

在将 db 字符串解析回 OffsetDateTime 时,我们不断收到如下所示的崩溃报告:

2019-0005-12T12:07:47-0500' 无法在索引 7 处解析 org.threeten.bp.format.DateTimeFormatter.parseToBuilder

对于 SimpleDateFormat,月份如何变为 0005?

安卓 DateFormatter ThreeTenBP

评论

0赞 Anonymous 5/14/2019
简单日期格式的可能重复会间歇性地返回错误的日期
0赞 Anonymous 5/14/2019
这是一个多线程问题。这个早已过时且臭名昭著的麻烦类不是线程安全的,当两个或多个线程同时使用时,通常会生成与您报告的字符串一样的字符串。考虑扔掉它,将 ThreeTenABP 添加到您的 Android 项目中,以便使用现代 Java 日期和时间 API。使用它要好得多。它的格式化程序,即类,线程安全的。SimpleDateFormatjava.timeDateTimeFormatter
1赞 Meno Hochschild 5/14/2019
很难相信这为月份部分产生了“0005”。无论如何,如果您使用 ThreetenBP 进行解析,那么为什么不也用于打印(有效地替换)。然后你最好摆脱。SimpleDateFormatSimpleDateFormatjava.util.Date
0赞 Meno Hochschild 5/14/2019
您应该重写代码,以在创建 的实例的行中添加 static 关键字。然后这个多线程问题变得更加清晰。SimpleDateFormat

答: 暂无答案