【问题标题】:Difference between 2 dates in days and in double2 个日期的天数和双倍日期之间的差异
【发布时间】:2018-04-16 20:39:45
【问题描述】:

我正在开发一个应用程序,我需要获取实际日期和用户插入的日期之间的差异,以天为单位,以双倍为单位。

知道如何制作这个吗?我尝试了一些方法,但没有成功。

【问题讨论】:

  • 你尝试过的“东西”是什么?
  • 双...什么?
  • 我认为在Double
  • 你尝试过的事情,它们在哪些方面不足或失败?当我们知道您在哪里时,我们可以更好地指导您(!)另外请举例说明输入和预期结果,因为“in double”相当不清楚/模棱两可。
  • 如果用户将日期作为字符串插入,则对其进行解析。我建议使用LocalDateDateTimeFormatter.ofLocalizedDate(),两者都可以在ThreeTenABP 中找到。使用ChronoUnit.DAYS.between() 表示日期之间的天数。所有假设 Java 是您的编程语言或至少是您的平台。如果太模糊,请编辑您的问题以更准确。

标签: android date days date-difference


【解决方案1】:

首先您必须决定是否要考虑一天中的时间和时区来计算差异,因为这会导致不同的结果。

示例:当前日期(也称为“今天”)是 4 月 17 日或 18 日,具体取决于您在世界的哪个地方。实际上,根据一天中的时间,世界上可能同时存在 3 个不同的“今天”。您使用哪个时区来计算差异?

  • 用户将输入一个日期:只有日、月和年?会进入营业时间吗?您使用的是用户设备的时区还是某个特定时区?
  • 同样的问题适用于当前日期

根据您所做的选择,您可能会得到不同的结果。

无论如何,我会使用这个库:http://www.threeten.org/threetenbp/ 或 java.time 类,如果在您的 API 级别可用。在这两个 API 中,您都可以使用以下内容。

要使用日期(仅限日-月-年)和设备的默认时区,我会选择 LocalDate 类:

// current date in device's default timezone
LocalDate now = LocalDate.now();

// some date from input values (May 10th 2018)
LocalDate dt = LocalDate.of(2018, 5, 10);

// difference in days
long diff = ChronoUnit.DAYS.between(now, dt); // 23

如果您想考虑一天中的时间(小时、分钟等),请使用LocalDateTime。但在这种情况下,ChronoUnit.DAYS 认为时间 >= 另一天已经过去(例如:4 月 17 日上午 10 点和 4 月 18 日上午 9:59 之间的差异是零天,因为一天中的时间没有'没有达到上午 10 点,所以它没有完成 1 天 - LocalDate 这不会发生,因为这个类没有时间字段并且只考虑日、月和年)。

如果您想考虑所有内容(日期、时间和时区),包括夏令时转换,请改用ZonedDateTime(代码非常相似,唯一的区别是您可以选择使用的时区):

// current date/time in device's default timezone
ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());

// some date from input values (May 10th 2018, 10 AM in New York timezone)
ZonedDateTime dt = ZonedDateTime.of(2018, 5, 10, 10, 0, 0, 0, ZoneId.of("America/New_York"));

// difference in days
long diff = ChronoUnit.DAYS.between(now, dt); // 23

您可以在设备的默认时区 (ZoneId.systemDefault()) 或特定时区 (ZoneId.of("America/New_York")) 之间进行选择。您可以使用ZoneId.getAvailableZoneIds() 查看所有可用时区。

也许在一个时区使用当前日期并在另一个时区使用用户的日期是没有意义的(我对两者都使用相同的日期),但这由您决定。

【讨论】:

    【解决方案2】:
    Calendar c = Calendar.getInstance();
    Calendar c2 //  = what you will get from the user
    long diff = c.getTimeInMillis()-c2.
    double days = (double) diff/(1000*60*60*24);
    

    这就是我的想法。 我希望这会有所帮助

    【讨论】:

      【解决方案3】:

      这样用

      public static double getTimeDiffBetweenDate(Date startDateTime, Date finishDateTime) {
          long diffInMilliseconds = finishDateTime.getTime() - startDateTime.getTime();
          return TimeUnit.MILLISECONDS.toMinutes(diffInMilliseconds) / 60.0;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多