private long calculateNextBirthday() {
final Calendar c = Calendar.getInstance();
c.set(2015, 8, 20);
//this is birthdate. set it to date you get from date picker
final Calendar today = Calendar.getInstance();
long eta = c.getTimeInMillis();
long now = System.currentTimeMillis();
long durationMills = eta - now;
long diffSeconds = durationMills / 1000;
long diffMinutes = diffSeconds / 60;
long diffHours = diffMinutes / 60;
long diffDays = diffHours / 24;
long remainDays = diffHours % 24;
final long millis = c.getTimeInMillis()
- today.getTimeInMillis();
// Convert to days
final long days = millis / 86400000; // Precalculated
// (24 *
// 60 *
// 60 *
// 1000)
return diffDays;
}
此方法应该计算给定日期的剩余天数,但是 我不知道为什么这不会返回确切的值。我认为这应该返回 30 或 31 ,但我得到 62 。
修改
我改变了我的代码,但我仍然没有得到确切的值:
private long calculateRemainingDays() {
final Calendar c = Calendar.getInstance();
c.set(2015, 7, 23);
final Calendar today = Calendar.getInstance();
final long millis = c.getTimeInMillis()
- today.getTimeInMillis();
// Convert to days
final long days = millis / 86400000;
return days;
}
答案 0 :(得分:2)
你得到的是正确的,当你使用8月你实际使用9月时,它被索引为0.最好使用内置常量,如Calendar.AUGUST,即7。 / p>
答案 1 :(得分:1)
您可以使用日期算术(Date
API减去DAYS.convert()
)代替使用自己的代码来查找差异。用于填充fromDate
和toDate
我在此使用的SimpleDateFormat
。您可以通过其他方式填充Date
。但主要的是你需要两个Date
才能找到差异。
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MM yyyy");
String date1 = "20 05 1985";
String date2 = "22 05 1999";
try {
Date toDate = dateFormat.parse(date2);
Date fromDate = dateFormat.parse(date1);
long diff = toDate.getTime() - fromDate.getTime();
System.out.println ("Difference in Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
} catch (ParseException e) {
e.printStackTrace();
}
答案 2 :(得分:1)
已经有两个答案可以解释为什么OP的原始代码不起作用或者如何使用java.util.Date
来解决他的问题。
我想添加带有java.time
的Java 8版本,以便使用更新的API显示更“现代”的方法。
calculateRemainingDays
方法可能如下所示:
private long calculateRemainingDays(final Temporal target) {
final LocalDate today = LocalDate.now();
return today.until(target, ChronoUnit.DAYS);
}
获取目标Temporal
并计算今天的天数差异。
可以像这样调用此方法:
final LocalDate target = LocalDate.of(2015, 8, 23);
System.out.println(calculateRemainingDays(target));
第一行为2015年8月的23 rd 创建LocalDate
(*)并将其传递给计算方法。结果将打印为(“现在”为2015年7月的20 th ):
34
请注意,如果target
日期 today
之前的,结果将为负数。
(*)注意,与Calendar
不同,LocalDate
中的月份不是从零开始的,因此 8 表示“八月”而不是“九月”。
LocalDate.of(int, int, int)
的JavaDoc片段:
公共静态LocalDate(int year,int month,int dayOfMonth)
参数:
年 - 代表的年份,从MIN_YEAR到MAX_YEAR
月 - 表示从1(1月)到12(12月)的年份 dayOfMonth - 表示的日期,从1到31
如果有人不确定如何使用此方法并且可能会对此问题和Calendar
版本感到困惑,那么他可以使用LocalDate.of
(JavaDoc)的重载版本:< / p>
final LocalDate target = LocalDate.of(2015, Month.AUGUST, 24);
这会从Month
枚举中获取一个值,因为它会显示月份的名称,所以不会对此产生混淆。