问题描述
我得到像 1604341549 这样的字符串,并想将它们转换为普通的日期格式,如 2012 年 2 月 12 日 4:00。这是我的实现
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
try {
Date d = sdf.parse(date);
sdf.applyPattern("dd MMM yyyy hh:mm");
holder.v.setText(sdf.format(d));
} catch (ParseException ex) {
Log.e("Exception",ex.getLocalizedMessage());
}
我检查了日志,它在 try 块之前将日期显示为字符串,但它没有在 try 块中实现,而是给出了一个错误“无法解析的日期:“1604341549”。
解决方法
看起来您的日期很长,以秒为单位对时间戳进行编码,因此您不需要解析字符串,而应该使用 Date
构造函数简单地构建一个 Date(long date)
对象。不要忘记乘以 1000 将秒转换为毫秒
java.time 通过脱糖
考虑使用 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。让我们首先声明两个格式化程序,一个用于您的输入,一个用于您想要的输出。
/** For parsing seconds since the epoch */
private static final DateTimeFormatter unixTimestampFormatter
= new DateTimeFormatterBuilder()
.appendValue(ChronoField.INSTANT_SECONDS)
.toFormatter();
/** For formatting into normal date and time */
private static final DateTimeFormatter normalFormatter
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
.withLocale(Locale.UK);
现在转换是这样的:
String inputStr = "1604341549";
Instant inst = unixTimestampFormatter.parse(inputStr,Instant.FROM);
String normalDateTimeStr = inst.atZone(ZoneId.systemDefault())
.format(normalFormatter);
System.out.println(normalDateTimeStr);
输出为:
2020 年 11 月 2 日 19:25:49
我确信 Shamm 在另一个答案中是正确的:您的输入字符串包含所谓的 Unix 时间戳,即自 Unix 纪元 1970 年 1 月 1 日 00:00 UTC。使用 java.time 我们可以构建一个解析这样的格式化程序。
为了提供“正常”输出,我使用了 Java 的内置日期和时间格式。在这种情况下,对于英国语言环境,但对于大多数内容用户,您应该使用您用户的语言环境。
您的代码出了什么问题?
首先,您试图将输入字符串解析为包含年、月、日、小时等,但它没有。因此,您很幸运地获得了异常,因此您意识到它是错误的(SimpleDateFormat
经常不提供该异常,让您相信一切都很好,但实际上并非如此)。
SimpleDateFormat
将 1604 解析为年,将 34 解析为月,将 15 解析为月中的第几天,将 49 解析为一天中的小时。然后它反对,因为分钟(和秒)没有任何数字。
问题:java.time 不需要 Android API 级别 26 吗?
java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6。
- 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,内置了现代 API。
- 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的向后移植(ThreeTen for JSR 310;请参阅底部的链接)。
- 在较旧的 Android 上,使用脱糖或 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保使用子包从
org.threeten.bp
导入日期和时间类。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time。
- Unix time
-
Java Specification Request (JSR) 310,其中首次描述了
java.time
。 -
ThreeTen Backport project,将
java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 - Java 8+ APIs available through desugaring
- ThreeTenABP,ThreeTen Backport 的 Android 版
- Question: How to use ThreeTenABP in Android Project,非常详尽的解释。