【问题标题】:SimpleDateFormat("dd/MM/yy kk:mm") showing time as 24:30 instead of 00:30 [duplicate]SimpleDateFormat("dd/MM/yy kk:mm") 将时间显示为 24:30 而不是 00:30 [重复]
【发布时间】:2021-09-09 14:02:25
【问题描述】:

我必须将 API 中的日期转换为 24 小时格式,但 SimpleDateFormat("dd/MM/yy kk:mm") 显示的是 24:30 而不是 00:30。

我收到的日期格式如下:“2020-05-25 10:34:27”

我将日期转换如下:

      val newDate: Date =  SimpleDateFormat("yyyy-MM-dd hh:mm:ss", 
    Locale.getDefault()).parse(vehiculos[b].fecha)
    val d = SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.getDefault())
            .parse(SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 
    Locale.getDefault()).format(newDate))
    val newFecha = SimpleDateFormat("dd/MM/yy kk:mm", Locale.getDefault()).format(d)

【问题讨论】:

  • 使用大写字母K即可解决问题。
  • 顺便考虑扔掉早已过时且臭名昭著的麻烦SimpleDateFormat和朋友。看看您是否可以使用desugaring 或将ThreeTenABP 添加到您的Android 项目中,以便使用现代Java 日期和时间API 的java.time。使用起来感觉好多了。

标签: android kotlin simpledateformat date-formatting date-conversion


【解决方案1】:

你应该使用大写字母K

SimpleDateFormat("dd/MM/yy KK:mm", Locale.getDefault())

k:一天中的小时 (1-24)

K:上午/下午 (0-11) 小时

查看此网站进行测试:http://www.sdfonlinetester.info/

【讨论】:

    【解决方案2】:

    java.time

    考虑为您的日期和时间工作使用现代 Java 日期和时间 API java.time。使用 java.time 将您的日期和时间保存在 LocalDateTime 对象中。 LocalDateTime 是没有与 UTC 偏移的时区的日期和时间。您也可以考虑使用ZonedDateTime 来代替 时区的日期和时间。

    当您从 API 收到字符串时,解析它。我正在展示如何使用此格式化程序:

    private static final DateTimeFormatter API_PARSER
            = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
                    .appendLiteral(' ')
                    .append(DateTimeFormatter.ISO_LOCAL_TIME)
                    .toFormatter(Locale.ROOT);
    

    解析过程如下。为了演示,我在一天中的某个时间使用了 00 小时,以便我们可以在格式化后检查它们是否显示为 24

        String fromApi = "2020-05-25 00:34:27";
        LocalDateTime dateTime = LocalDateTime.parse(fromApi, API_PARSER);
        System.out.println(dateTime);
    

    这个 sn-p 的输出是:

    2020-05-25T00:34:27

    仅当您需要提供字符串输出时,例如给用户,将我们得到的LocalDateTime 格式化为字符串。为此,我们需要第二个格式化程序:

    private static final DateTimeFormatter NEW_FORMATTER
            = DateTimeFormatter.ofPattern("dd/MM/yy HH:mm", Locale.ROOT);
    

    有了它我们可以做到:

        String formattedDateTime = dateTime.format(NEW_FORMATTER);
        System.out.println(formattedDateTime);
    

    25/05/20 00:34

    我们得到了00 所需的小时数。

    问题:java.time 不需要 Android API 26 级吗?

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

    • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
    • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
    • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

    你做错了什么?

    • 在大多数情况下,尝试将日期和时间从一种字符串格式转换为另一种是错误的方法。不要将日期和时间保留为字符串。保留适当的日期时间对象。例如ZonedDateTimeLocalDateTime
    • 您使用的日期和时间类设计不佳且过时已久 DateSimpleDateFormat
    • 你把事情弄得太复杂了。您从String 转换为Date,再次转换为String,再次转换为Date,最后一次转换为String。您不可能需要所有这些,而且每次操作都会多一次出错。
    • 正如其他人已经说过的那样,kkclock-hour-of-day (1-24),这就解释了为什么你没有得到 00 而是 24您的最后一次转换。在 java.time 中,大写 HH 表示一天中从 0023 的小时。
    • 不考虑时区可能是也可能不是错误。如果你知道服务器和用户在同一个时区,或者服务器知道用户所在的时区,并按照日期分发,你就可以了。如果服务器和用户使用不同的时区,则需要对您的日期和时间进行时区转换。

    链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2012-01-27
      • 2011-03-12
      • 2021-10-13
      相关资源
      最近更新 更多