在andorid

问题描述

我得到像 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 导入日期和时间类。

链接