Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 两个localDate之间的差异_Datetime_Kotlin - Fatal编程技术网

Datetime 两个localDate之间的差异

Datetime 两个localDate之间的差异,datetime,kotlin,Datetime,Kotlin,我有一个json返回的日期,它以字符串形式存在于以下变量中: val dateEvent=“2019-12-28 21:00:00” 我需要的计算是知道当前日期还剩多少天、多少小时、多少分钟 我已经找到了一些解决方案,但这些方案用作输入“2019-12-28”,并且我有包含时间的格式。使用以下功能: fun counterTime(eventtime: String): String { var day = 0 var hh = 0 var mm = 0 try

我有一个json返回的日期,它以字符串形式存在于以下变量中:

val dateEvent=“2019-12-28 21:00:00”

我需要的计算是知道当前日期还剩多少天、多少小时、多少分钟


我已经找到了一些解决方案,但这些方案用作输入“2019-12-28”,并且我有包含时间的格式。

使用以下功能:

fun counterTime(eventtime: String): String {
    var day = 0
    var hh = 0
    var mm = 0
    try {
        val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        val eventDate = dateFormat.parse(eventtime)
        val cDate = Date()
        val timeDiff = eventDate.time - cDate.time

        day = TimeUnit.MILLISECONDS.toDays(timeDiff).toInt()
        hh = (TimeUnit.MILLISECONDS.toHours(timeDiff) - TimeUnit.DAYS.toHours(day.toLong())).toInt()
        mm =
            (TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff))).toInt()
    } catch (e: ParseException) {
        e.printStackTrace()
    }

    return if (day == 0) {
        "$hh hour $mm min"
    } else if (hh == 0) {
        "$mm min"
    } else {
        "$day days $hh hour $mm min"
    }
}
柜台时间(2019-08-27 20:00:00)

这将返回
24天6小时57分钟

注意:事件日期应始终是当前日期的未来日期。

java.time 由于您可以使用Java 9(很抱歉,我只能编写Java代码):

刚才我运行代码时,输出是:

145天4小时19分钟

在Java6、7和8中,持续时间的格式有点冗长,请搜索how

避免使用SimpleDateFormat和朋友
在另一个答案中使用的
SimpleDateFormat
Date
类设计糟糕,而且早已过时。我最诚实的观点是,2019年不应该有人使用它们。现代java日期和时间API java.time非常适合使用。

LocalDate,顾名思义,就是日期。它不包含时间。LocalDateTime包含一个时间,但它并不表示精确的瞬间,而是一个挂钟日期和时间。使用ZoneDateTime。(由于DST对这个差异有影响,因此您必须确定一个时区来计算这个日期时间和现在之间的时间)。javadoc是你的朋友。输入ZoneDateTime是GMT-05:00这不是时区,这是偏移量。在世界许多地方,冬季的偏移量不同于夏季的偏移量。例如,在时区“欧洲/巴黎”中,偏移量夏季为2小时,冬季为1小时。正是这一点使得使用实际时区非常重要,否则结果可能会偏离一个小时。我对时区不感兴趣,它只是减去两个示例日期
2019-12-28 21:00:00-2019-12-30 21:00:00
这些日期是只适用于一个国家的迪斯科舞厅活动的日期。我知道要做减法,我必须将字符串转换为日期类型,要格式化它,我必须将其格式化为GMT-05:00示例:
Wed Aug 28 21:00:00 GMT-05:00 2019
,所以使用时区
“America/Lima”
,我认为这假设了默认区域设置的时区。如果这不是您期望的时区,它可能会在任何持续时间内给出错误的结果,包括任一时区使时钟向前或向后的时间。(在处理时间时,始终值得考虑时区…)事件从json获取,以在recyclerview中显示它们,当满足日期时,事件不再存在。活动针对特定国家(当地时间)。检查json的日期,我看到它是在UTC
{“UTC_start_date”:“2019-08-28 21:00:00”}
,将该函数改编为UTCFYI会很有趣,非常麻烦的日期时间类,例如,
java.text.SimpleDateFormat
现在被java 8和更高版本中内置的类所取代。看见
    DateTimeFormatter jsonFormatter = DateTimeFormatter.ofPattern("u-M-d H:mm:ss");
    String dateEvent = "2019-12-28 21:00:00";
    Instant eventTime = LocalDateTime.parse(dateEvent, jsonFormatter)
            .atOffset(ZoneOffset.UTC)
            .toInstant();
    Duration timeLeft = Duration.between(Instant.now(), eventTime);
    System.out.format("%d days %d hours %d minutes%n",
            timeLeft.toDays(), timeLeft.toHoursPart(), timeLeft.toMinutesPart());