计算android中当前日期的剩余年,月和日

时间:2015-12-04 12:35:28

标签: android date

我需要输出年,月和日中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;

1 个答案:

答案 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

如果您的婚礼日期输入在将来,那么只需在计算之间交换开始和结束,以避免负面持续时间。