【问题标题】:Convert time "PT10H30M" to "10:30 AM" time JAVA Android将时间“PT10H30M”转换为“10:30 AM”时间JAVA Android
【发布时间】:2017-12-19 22:55:33
【问题描述】:

我正在尝试将"PT10H30M" 格式的时间转换为"10:30 AM" 格式并将其保存在Date、Java Android 中的时间或时间戳变量中。

有什么解决办法吗?

【问题讨论】:

  • 您希望得到哪种类型的ObjectCalendar? Date?
  • 我更喜欢日期或时间,我不知道在 JAVA 中是否退出时间戳,但任何类型,只需将“PT10H30M”转换为“10:30 AM”
  • 您的输入字符串表示未附加到时间线的时间跨度。正确的对象表示是 java.time 中的 Duration(请参阅下面 Hugo 的回答以获取 back-port to Android)。诸如“上午 10:30”之类的一天中的时间不是时间跨度。您的输入字符串已经在 ISO 8601 标准定义的这样一个时间跨度的正确文本表示中。

标签: java android time timestamp


【解决方案1】:

从技术上讲,PT10H30M 不是时间,而是代表duration一定量 的时间(10 小时 30 分钟)。该字符串采用标准ISO 8601 格式。

虽然“名称”(10 小时 30 分钟)与 10:30 AM(上午 10 小时 30 分钟)相似,但它们是完全不同的概念:

  • 10:30 AM 代表一天中的某个时间
  • PT10H30M 表示时间量 - 例如,可以添加到日期/时间:
    • 01:00 AM 加上 PT10H30M 的持续时间导致 11:30 AM
    • 11:00 PM 加上 PT10H30M 的持续时间导致第二天的 09:30 AM

无论如何,您可以通过将PT10H30M 的持续时间添加到午夜 (00:00) 来实现您想要的。

在 Android 中,您可以使用 ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的反向移植。您还需要ThreeTenABP(更多关于如何使用它here)。

您可以使用LocalTime(表示时间,包含小时、分钟、秒和nanoseconds),使用constant for midnight 00:00:00.0,并在其中添加Duration

import org.threeten.bp.LocalTime;
import org.threeten.bp.Duration;

LocalTime time = LocalTime.MIDNIGHT.plus(Duration.parse("PT10H30M"));

结果将是一个time 变量,其中包含与10:30 AM 对应的值。


如果你想要对应的String,可以使用org.threeten.bp.format.DateTimeFormatter

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
System.out.println(time.format(fmt));

结果是String,其值为10:30 AM。 (请注意,我还使用了java.util.Locale 来确保它正确格式化String)。

【讨论】:

  • 正是我所需要的,非常非常感谢你。只需添加,用于导入 org.threeten.bp.LocalTime;导入 org.threeten.bp.Duration;是否需要转到 gradle 并添加依赖项依赖项 { compile 'com.jakewharton.threetenabp:threetenabp:1.0.3' }
  • @RaZoDiuM 在 Stack Overflow 上,欢迎您自己对答案进行此类修复或添加。
猜你喜欢
  • 1970-01-01
  • 2018-01-21
  • 2011-12-29
  • 1970-01-01
  • 2015-09-26
  • 2013-04-11
  • 2021-03-19
  • 2017-01-16
  • 2015-07-07
相关资源
最近更新 更多