【问题标题】:android timestamp parsing gone wrong(always in 1970)android 时间戳解析出错(总是在 1970 年)
【发布时间】:2015-05-26 05:46:35
【问题描述】:

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

这是部分工作。我现在遇到的问题是我的日期是 1970 年 1 月 1 日(而不是 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

我做错了什么?

【问题讨论】:

    标签: android date unix-timestamp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我想提供现代答案。

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

      这个 sn-p 的输出是:

      23-03-2015

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

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

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

      是的,java.time 在较旧和较新的 Android 设备上都能正常运行。它只需要至少 Java 6

      • 在 Java 8 及更高版本以及更新的 Android 设备上(据我所知,从 API 级别 26 开始)现代 API 是内置的。
      • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
      • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

      我使用 backport 编写并运行了上面的 sn-p 以确保它与 ThreeTenABP 兼容。

      链接

      【讨论】:

        【解决方案3】:

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

        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 开始以 毫秒 为单位测量时间。您需要将 Unix 时间戳乘以 1000:

        cal.setTimeInMillis(dateMulti * 1000L);
        

        【讨论】:

        • 把它改成dd-MM-yyyy 有一个变化结果是一样的
        • Unix 时间戳以秒为单位。您需要乘以 1000 才能得到毫秒:cal.setTimeInMillis(dateMulti * 1000L);
        【解决方案4】:

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

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

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

        【讨论】:

        • 然后我得到了我需要几个月的分钟,这是我的错误,但你的意见很棒!
        猜你喜欢
        • 1970-01-01
        • 2020-06-18
        • 1970-01-01
        • 2018-11-20
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多