gpt4 book ai didi

Android:如何从 SystemClock.elapsedRealTime 转换为人类可读的 CharSeq?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:08:30 50 4
gpt4 key购买 nike

如何从 SystemClock.elapsedRealTime() 转换到可以在 textview 中显示的人类可读的 CharSeq?

最佳答案

tl;博士

Duration.ofMillis(                 // Represent a span of time on scale of hours-minutes-seconds, unattached to the timeline.
SystemClock.elapsedRealTime() // 441_000L as an example.
)
.toString() // Generate a String in standard ISO 8601 format.

PT7M21S



避免时间格式

以时间格式 (HH:MM:SS.SSS) 显示耗时具有误导性和歧义,因为它很容易被误解为时间。

ISO 8601 – 持续时间格式

ISO 8601标准定义了各种日期时间值的合理字符串表示。这些值包括耗时。

标准格式为 PnYnMnDTnHnMnS开头标有 P而一个 T将年-月-日部分与时-分-秒部分分开。例如:
  • PT30M = 半小时
  • PT8H30M = 八个半小时
  • P3Y6M4DT12H30M5S表示“三年六个月四天十二小时三十分五秒”的持续时间。

  • 通常,术语“期间”或“持续时间”用作同义词。日期时间工作中的术语尚未标准化。请注意标准如何使用术语“持续时间”,但格式以 P 开头。如“期间”。这就是生活。

    时间

    java.time 类提供了两个类来表示与时间线无关的时间跨度:
  • Period年月日
  • Duration 时分秒

  • 这两个类都解析/生成标准 ISO 8601上面讨论的持续时间格式。

    您来自 SystemClock.elapsedRealTime() 的输出是 long计算经过的毫秒数的整数。所以我们想可能想使用 Duration 类(class)。
    long millis = SystemClock.elapsedRealTime() ;
    Duration d = Duration.ofMillis( millis ) ;

    让我们试试 441000 作为我们的毫秒。
    Duration d = Duration.ofMillis( 441_000L ) ;

    生成标准格式的字符串。对于 441_000L ,我们得到 7 分 21 秒。
    String output = d.toString() ;  // Generate standard ISO 8601 string.

    PT7M21S



    你可以解析标准字符串,得到一个 Duration目的。
    Duration d = Duration.parse( "PT7M21S" ) ;

    我建议教你的用户阅读标准的 ISO 8601 格式,因为它可读且明确。我强烈建议永远不要显示为时间格式( 00:07:21 ),因为我已经看到歧义会导致用户混淆。但是如果您的用户群不适合标准格式,您可以生成其他字符串。

    在该类的一些更高版本中,您可以调用 to…Part检索七和二十一的方法。
    int minutesPart = d.toMinutesPart() ; // The whole-minutes portion.
    int secondsPart = d.toSecondsPart() ; // The whole-seconds portion.

    您还可以返回总计毫秒。
    long millis = d.toMillis() ;  // Not the part, but the entire span of time in terms of milliseconds.

    关于 java.time

    java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

    Joda-Time项目,现在在 maintenance mode ,建议迁移到 java.time类。

    要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310 .

    您可以直接与您的数据库交换 java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*类。

    从哪里获得 java.time 类?
  • Java SE 8 , Java SE 9 , Java SE 10 , 然后
  • 内置。
  • 具有 bundle 实现的标准 Java API 的一部分。
  • Java 9 添加了一些小功能和修复。
  • Java SE 6Java SE 7
  • ThreeTen-Backport 中,大部分 java.time 功能被反向移植到 Java 6 和 7。 .
  • Android
  • 更高版本的 Android bundle 实现 java.time 类。
  • 对于早期的 Android (<26),ThreeTenABP项目采用 ThreeTen-Backport(如上所述)。见 How to use ThreeTenABP… .

  • ThreeTen-Extra项目使用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

    乔达时间

    更新: Joda-Time 项目现在处于维护模式,团队建议迁移到 java.time 类。为了历史,我将这部分原封不动地保留下来。

    Joda-Time库提供三个类来表示时间跨度, Interval , Duration , 和 Period .最后一个, Period , 表示描述为天数、小时数等的时间跨度。它与这种特殊的 ISO 8601 格式并行。 Period类还解析并生成 ISO 8601 格式的字符串。 Joda-Time 可以在 Android 中运行,它已经很老旧并且非常流行,可以替代臭名昭著的 java.util.Date/.Calendar 类。
    Period类需要一个 long整数作为持续时间的毫秒计数。正是我们需要的,如 SystemClock.elapsedRealtime() 自机器启动以来,以毫秒为单位为我们提供计数。
    long machineUptimeMillis = SystemClock.elapsedRealtime() ;
    Period machineUptimePeriod = new Period( machineUptimeMillis );
    String output = machineUptimePeriod.toString(); // Ex: P3DT2H15M37.123S

    如果我们要跟踪某个操作需要多长时间,我们将使用一对这样的 long s 在减法中。
    long start = SystemClock.elapsedRealtime() ;
    // … Perform some operation …
    long stop = SystemClock.elapsedRealtime() ;
    long elapsedMillis = stop - start ;
    Period elapsedPeriod = new Period( elapsedMillis );

    小写

    为了向人类用户展示,您可能希望去掉 P和/或 T并使用小写字母以获得更好的可读性。
    String output = elapsedPeriod.toString().replace( "P" , "" ).replace( "T", " " ).toLowerCase() ; 

    例如, 3y6m4d 12h30m5s .

    漂亮版画

    您可以漂亮地打印 Period值,例如“5 年零 2 个月”。

    使用内置 Locale-sensitive word-based formatter .
    PeriodFormatter formatter = PeriodFormat.wordBased( Locale.CANADA_FRENCH ) ;
    String output = formatter.print( elapsedPeriod ) ;

    或者使用 PeriodFormatterBuilder 创建您自己的自定义格式.
     PeriodFormatter yearsAndMonths = new PeriodFormatterBuilder()
    .printZeroAlways()
    .appendYears()
    .appendSuffix(" year", " years")
    .appendSeparator(" and ")
    .printZeroRarelyLast()
    .appendMonths()
    .appendSuffix(" month", " months")
    .toFormatter() ;

    关于Android:如何从 SystemClock.elapsedRealTime 转换为人类可读的 CharSeq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31574615/

    50 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com