两个日期之间的差异,天数和双倍

时间:2018-04-16 20:39:45

标签: android date days date-difference

我正在开发一个应用程序,我需要区分实际日期和用户插入的日期,天数和双倍。

关于如何制作这个的任何想法?我尝试了一些但没有成功的事情。

3 个答案:

答案 0 :(得分:2)

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

示例:当前日期(AKA"今天")是4月17日或18日,具体取决于您所在的世界。实际上,根据一天的时间,可能会有3种不同的"今天"在世界上,同时。你用什么时区计算差异?

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

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

无论如何,我使用这个lib: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分之间的差异是0天,因为时间是这一天没有到达上午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()检查所有可用的时区。

将一个时区中的当前日期和另一个时区中的用户日期使用可能没有意义(我对两者都使用相同的日期),但这取决于你决定。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用这种方式

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