我需要输出年,月和日中2个日期之间的差异。 在我的代码中,当从1年减去两到三天时,它会产生错误的输出 像剩余的年,月,日是0年/ 12个月/ 3天 这就是我的工作。
Date date = null, date1 = null;
try {
date = formatter.parse(SharedPreference.getWeddingDate(getActivity()));
date1 = formatter.parse(getCurrentTimeStamp());
targetTime = new GregorianCalendar();
targetTime.setTime(date);
currentTime = new GregorianCalendar();
currentTime.setTime(date1);
}
catch (ParseException e) {
e.printStackTrace();
}
long timeOne = date.getTime();
long timeTwo = date1.getTime();
long oneDay = 1000 * 60 * 60 * 24;
long delta = (timeTwo - timeOne) / oneDay;
int year = (int) (delta / 365);
int rest = (int) (delta % 365);
int month = rest / 30;
rest = rest % 30;
答案 0 :(得分:0)
不幸的是,java.util.Calendar
周围的内容并没有为您提供持续时间计算的支持。我知道Android平台上有三个外部库可以做得更好,让你头疼。在内部,计算并不像有些人想让你相信那么简单。例如,也涉及时区。
// input
String tz = "Europe/Paris";
java.util.Date d1 = new java.util.Date(0); // or: SharedPreference.getWeddingDate(getActivity());
java.util.Date d2 = new java.util.Date();
// library Threeten-ABP (similar but not identical to Java-8)
LocalDate start = Instant.ofEpochMilli(d1.getTime()).atZone(ZoneId.of(tz)).toLocalDate();
LocalDate end = Instant.ofEpochMilli(d2.getTime()).atZone(ZoneId.of(tz)).toLocalDate();
Period p = Period.between(start, end);
System.out.println(p.getYears()); // 45
System.out.println(p.getMonths()); // 11
System.out.println(p.getDays()); // 3
System.out.println(p); // P45Y11M3D
// Joda-Time-Android
DateTimeZone dtz = DateTimeZone.forID(tz);
org.joda.time.LocalDate jd1 = new org.joda.time.LocalDate(d1, dtz);
org.joda.time.LocalDate jd2 = new org.joda.time.LocalDate(d2, dtz);
org.joda.time.Period jp = new org.joda.time.Period(jd1, jd2, PeriodType.yearMonthDay());
System.out.println(jp.getYears()); // 45
System.out.println(jp.getMonths()); // 11
System.out.println(jp.getDays()); // 3
System.out.println(jp); // P45Y11M3D
// my library Time4A
PlainDate date1 = TemporalType.JAVA_UTIL_DATE.translate(d1).toZonalTimestamp(tz).toDate();
PlainDate date2 = TemporalType.JAVA_UTIL_DATE.translate(d2).toZonalTimestamp(tz).toDate();
Duration<CalendarUnit> duration = Duration.inYearsMonthsDays().between(date1, date2);
System.out.println(duration.getPartialAmount(CalendarUnit.YEARS)); // 45
System.out.println(duration.getPartialAmount(CalendarUnit.MONTHS)); // 11
System.out.println(duration.getPartialAmount(CalendarUnit.DAYS)); // 3
System.out.println(duration); // P45Y11M3D
如果您的婚礼日期输入在将来,那么只需在计算之间交换开始和结束,以避免负面持续时间。