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

时间:2015-03-23 09:29:38

标签: android date unix-timestamp

我试图将字符串(带有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();
    }

其中Date = 1427101853 结果= 17-01-1970

我做错了什么?

4 个答案:

答案 0 :(得分:21)

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

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

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

编辑自格林威治标准时间01-01-1970 00:00:00以来,Unix时间戳是的数字。自01-01-1970 00:00:00 GMT以来,Java以毫秒的形式测量时间。您需要将Unix时间戳乘以1000:

cal.setTimeInMillis(dateMulti * 1000L);

答案 1 :(得分:1)

为什么"dd-mm-yyyy"中的SimpleDateFormat"dd-MM-yyyy"中的DateFormat.format?使用此:

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

如果你想要分钟,如果你想要几个月,你必须把MM像@Jesper所说:)

答案 2 :(得分:0)

我想贡献现代的答案。

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);

此代码段的输出为:

  

2015年3月23日

输出与在线转换器一致(底部链接)。它告诉我您的时间戳等于“ 03/23/2015 @ 9:10 am(UTC)”(也同意您提出问题的日期)。如果不是非洲/科纳克里,请替换您的时区。

您使用的日期时间类-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(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

我使用反向端口编写并运行了上面的代码片段,以确保它与ThreeTenABP兼容。

链接

答案 3 :(得分:0)

在使用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 + "";
}

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