android 时间戳解析出错(总是在 1970 年)

android timestamp parsing gone wrong(always in 1970)

我正在尝试将字符串(带有 unix 时间戳)转换为格式为 (dd-MM-yyyy)

的日期

这部分起作用了。我现在遇到的问题是我的日期是 17-01-1970(而不是 2015 年 3 月 16 日)

我是这样转换的:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    Date d = null;
    int dateMulti = Integer.parseInt(Date);
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(dateMulti);
    String date = DateFormat.format("dd-MM-yyyy", cal).toString();

    Log.d("test",date);
    try {
        d = dateFormat.parse(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }

其中日期 = 1427101853 结果 = 17-01-1970

我做错了什么?

您在第一行中使用了错误的格式字符串:

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-mm-yyyy");

mm 是分钟。请改用 MM(月)。

edit Unix 时间戳是自 01-01-1970 00:00:00 GMT 以来的 的数字。 Java 测量自 01-01-1970 00:00:00 GMT 以来的时间 毫秒 。您需要将 Unix 时间戳乘以 1000:

cal.setTimeInMillis(dateMulti * 1000L);

为什么 SimpleDateFormat 中有 "dd-mm-yyyy"DateFormat.format 中有 "dd-MM-yyyy"?使用这个:

String date = DateFormat.format("dd-mm-yyyy", cal).toString();

如果你想要几分钟,如果你想要几个月,你必须像@Jesper 说的那样输入 MM:)

我想贡献现代答案。

java.time

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.MEDIUM)
            .withLocale(Locale.forLanguageTag("da"));
    String unixTimeStampString = "1427101853";
    int dateMulti = Integer.parseInt(unixTimeStampString);
    ZonedDateTime dateTime = Instant.ofEpochSecond(dateMulti)
            .atZone(ZoneId.of("Africa/Conakry"));
    String formattedDate = dateTime.format(dateFormatter);
    System.out.println(formattedDate);

此片段的输出是:

23-03-2015

输出与在线转换器一致(link 在底部)。它告诉我你的时间戳等于“03/23/2015 @ 9:10am (UTC)”(它也与你提出问题的日期一致)。如果不是 Africa/Conakry,请替换为您的时区。

您使用的日期时间 类 — SimpleDateFormatDateCalendar — 早已过时且设计不佳,因此我建议您跳过它们并改用 java.time、现代 Java 日期和时间 API。众多优点中的一个小优点是它直接接受纪元以来的秒数,因此您无需转换为毫秒。虽然这没什么大不了的,但自己进行时间转换是一个坏习惯,将转换留给适当的库方法会使代码更清晰、更有说服力且更不容易出错。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的 link)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

我编写并 运行 上面的代码片段使用向后移植来确保它与 ThreeTenABP 兼容。

链接

我在使用的时候也遇到了同样的问题SimpleDateFormat这是我自己做的一个方法,对我来说效果很好。

 private String getmDate(long time1) {
    java.util.Date time = new java.util.Date((long) time1 * 1000);
    String date = DateFormat.format("dd-MMM-yyyy' at 'HH:mm a", time).toString();
    return date + "";
}

您可以根据需要更改日期格式。