目前,我继续修补我最喜欢的一个项目的功能。我决定加入阻止用户执行某些操作的功能,并显示一个横幅来显示冷却时间。
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帖子之前,请考虑该场景。
如果您使用的是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 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