【问题标题】:Difference Between Two localDate两个localDate之间的区别
【发布时间】:2019-08-03 16:24:41
【问题描述】:

我有一个json返回的日期,它在以下变量中作为字符串:

val dateEvent = "2019-12-28 21:00:00"

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

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

【问题讨论】:

  • LocalDate,顾名思义,用于日期。它不包含时间。 LocalDateTime 包含一个时间,但它不代表一个精确的瞬间,只是一个挂钟日期和时间。使用 ZonedDateTime。 (您必须确定一个时区来计算这个日期时间和现在之间的时间,因为 DST 会影响这种差异)。 javadoc 是你的朋友。
  • 输入 ZonedDateTime 是 GMT-05:00
  • 那不是时区,那是偏移量。在世界许多地方,冬季的偏移量与夏季的偏移量不同。例如,在时区“Europe/Paris”中,偏移量在夏季为 2 小时,在冬季为 1 小时。正是这一点使得使用实际时区变得很重要,否则结果可能会相差一小时。
  • 我对时区不感兴趣,它只是减去两个示例日期2019-12-28 21:00:00 - 2019-12-30 21:00:00 这些日期是仅适用于一个国家/地区的迪斯科活动的日期。我知道要进行减法,我必须将字符串转换为 Date 类型,要对其进行格式化,我必须将其格式化为 GMT-05: 00 例如:Wed Aug 28 21:00:00 GMT-05: 00 2019
  • 所以使用时区"America/Lima"

标签: datetime kotlin


【解决方案1】:

java.time

从Java 9开始就可以了(抱歉我只能写Java代码):

    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());

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

145 天 4 小时 19 分钟

在 Java 6、7 和 8 中,持续时间的格式有点冗长,请搜索如何。

避免 SimpleDateFormat 和朋友

另一个答案中使用的 SimpleDateFormatDate 类设计不佳且早已过时。老实说,在 2019 年没有人应该使用它们。java.time,现代 Java 日期和时间 API,使用起来更好。

【讨论】:

    【解决方案2】:

    使用以下函数:

    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"
        }
    }
    

    counterTime(2019-08-27 20:00:00)

    这将返回24 days 6 hour 57 min

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

    【讨论】:

    • 我认为这是假设默认语言环境的时区。如果这不是您期望的时区,它可能会在任何持续时间内给出错误的结果,包括任一时区将时钟向前或向后的时间。 (在处理时间时,总是值得考虑时区......)
    • 事件是从 json 中获取的,以便在 recyclerview 中显示它们,当满足日期时,事件不再存在。这些事件针对特定国家(当地时间)。检查 json 的日期,我发现它是 UTC {"utc_start_date":"2019-08-28 21:00:00"},将这个函数调整为 UTC 会很有趣
    • 仅供参考,诸如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多