当前位置: 首页 > 知识库问答 >
问题:

持续时间的最佳选择是什么。什么时候针对Android API

孟宏才
2023-03-14

目前,我继续修补我最喜欢的一个项目的功能。我决定加入阻止用户执行某些操作的功能,并显示一个横幅来显示冷却时间。

Eg.

给定:从2019年11月19日凌晨2:00(1574128800)到2019年11月21日下午6:32:00(1574361120),用户因执行某些操作而被阻止。

输出:2天16小时32分钟

这就是我现在的方法。不幸的是,它只适用于Android API

/**
 * If using for Android, `Duration` requires API > 26
 * @param start Epoch time in milliseconds
 * @param end Epoch time in milliseconds
 */
fun getReadableBetween(start: Long, end: Long): String {
    val startDate = Date(start)
    val endDate = Date(end)
    var duration = Duration.between(startDate.toInstant(), endDate.toInstant())

    val days = duration.toDays()
    duration = duration.minusDays(days)
    val hours = duration.toHours()
    duration = duration.minusHours(hours)
    val minutes = duration.toMinutes()

    val stringBuilder = StringBuilder()

    if (days != 0L) {
        stringBuilder.append(days)
        if (days == 1L) {
            stringBuilder.append(" day ")
        } else {
            stringBuilder.append(" days ")
        }
    }

    if (hours != 0L) {
        stringBuilder.append(hours)
        if (hours == 1L) {
            stringBuilder.append(" hour ")
        } else {
            stringBuilder.append(" hours ")
        }
    }


    if (minutes != 0L) {
        stringBuilder.append(minutes)
        if (minutes == 1L) {
            stringBuilder.append(" minute.")
        } else {
            stringBuilder.append(" minutes.")
        }
    }

    println("Breakdown:")
    println("Days: $days")
    println("Hours: $hours")
    println("Minutes: $minutes")

    return stringBuilder.toString()
}

尽管我很想使用第三方库,但我想使用开箱即用的日期和时间API的基本原理来弄脏我的手。

PS.在将此链接到其他SO帖子之前,请考虑该场景。

共有2个答案

卫景明
2023-03-14

如果您使用的是Gradle插件4.0或更高版本(Android Studio 4.0或更高版本),那么您可以利用D8核心库Desugaring。这包括java中的一部分功能。时间将允许您使用java。时间项目中的持续时间;即使您需要支持早于API 26的版本。

在模块的build.gradle文件中:

android {

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        coreLibraryDesugaringEnabled true
    }

    // If using Kotlin
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8
    }
}
dependencies {
    …
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
}

您现在应该可以无错误地使用这个类了。

一些来源:

  • Android的造型
  • 杰克·沃顿
  • Android开发者
澹台景辉
2023-03-14

决定为Android API创建一个遗留函数

/**
 * If using for Android & API < 26
 * @param start Epoch time in milliseconds
 * @param end Epoch time in milliseconds
 */
fun getReadableBetweenLegacy(start: Long, end: Long): String {
    val startDate = Date(start)
    val endDate = Date(end)
    val calendar = Calendar.getInstance()
    val diff = endDate.time - startDate.time
    calendar.timeInMillis = diff

    val daySeconds = 1000 * 60 * 60 * 24
    val hourSeconds = 1000 * 60 * 60
    val days = diff / daySeconds
    val hours = ((diff - (daySeconds * days)) / (hourSeconds));
    val minutes = (diff - (daySeconds * days) - (hourSeconds * hours)) / (1000 * 60)

    val stringBuilder = StringBuilder()
    if (days != 0L) {
        stringBuilder.append(days)
        if (days == 1L) {
            stringBuilder.append(" day ")
        } else {
            stringBuilder.append(" days ")
        }
    }

    if (hours != 0L) {
        stringBuilder.append(hours)
        if (hours == 1L) {
            stringBuilder.append(" hour ")
        } else {
            stringBuilder.append(" hours ")
        }
    }


    if (minutes != 0L) {
        stringBuilder.append(minutes)
        if (minutes == 1L) {
            stringBuilder.append(" minute.")
        } else {
            stringBuilder.append(" minutes.")
        }
    }

    println("Breakdown:")
    println("Days: $days")
    println("Hours: $hours")
    println("Minutes: $minutes")

    return stringBuilder.toString()
}

解决方案非常简单,几乎没有误差。

 类似资料:
  • 问题内容: 我习惯于进行Java编程,在编程时,您无需真正考虑指针。但是,此刻我正在用C ++编写程序。在创建具有其他类成员的类时,何时应该使用指针,何时不应该使用指针?例如,什么时候我想这样做: 与此相反: 问题答案: 首先避免指针。 在以下情况下使用它们: 您想使用Pimpl习惯用法或抽象工厂。 该实例实际上是由程序的其他部分管理的,而该类仅需要能够访问它。 您想推迟对象的构建(即,您想 在

  • 问题内容: 是否有人在使用LINQ to MySQL的实用程序?你知道哪一个最好吗? 到目前为止,我知道用于NHibernate的LINQ和DBLinq 问题答案: 还有LINQ to LLBLGEN,它可以支持许多数据库。 从LLBLGEN的功能页面 支持SQL Server(MSDE,SQL Server 7/2000/2005 / Express,SQL CE 2.0、3.0、3.5),SQ

  • 问题内容: 我来自没有显式指针的语言,因此我不太了解它们的存在重点(无双关语)。 问题是,在大多数情况下,我不知道为什么要传递指向函数的指针。我确实知道,当您传递一个指针时,到处都会对该变量进行修改,但这有什么意义呢?为什么不修改值并返回结果呢? 例如,是一个函数,该函数接收和作为参数。我读过接口实际上是指针(是吗?),但是我没有得到的是为什么? 为什么我要指向作家?我没有修改它,只是在写它。而且

  • 问题内容: 流式XML解析器(例如SAX和StAX)比构建像DOM解析器之类的树结构的解析器更快,内存效率更高。SAX是推送分析器,这意味着它是观察者模式(也称为侦听器模式)的实例。SAX首先出现,然后是StAX- 拉式解析器,这意味着它基本上像迭代器一样工作。 您可以找到在任何地方都偏爱StAX而不是SAX的原因,但是通常可以归结为:“更易于使用”。 在JAXP上的Java教程中,StAX被模糊

  • 考虑以下两行代码: 对我来说,他们看起来很相似。但是,第二行被Java编译器(1.8)拒绝,消息是“不能推断SimpleFileVisitor的类型参数<>”。 谁能解释一下,有什么问题吗?

  • 本文向大家介绍什么时候用delegate,什么时候用Notification?相关面试题,主要包含被问及什么时候用delegate,什么时候用Notification?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate针对one-to-one关系,并且reciever可以返回值 给sender,notification 可以针对one-to-one/many/none,recieve