在Android中计算两个日期之间的年月

时间:2020-06-08 12:42:42

标签: java android date datetime time

我正在尝试显示两个日期之间的自定义文本结果。这是片段中的代码,该代码返回两个日期:

public class HomeFragment extends BaseFragment {

  ...

  dashboardViewModel.productCategory.observe(this, data - > {
    if (data != null && data.getData() != null) {
      int totalLos = Integer.parseInt(data.getData().getLos());
      Log.e("totalLOS", String.valueOf(totalLos));
      explainDays(totalLos);
      mBinding.los.setText("");
    }
  });

}

下面是BaseFragment中的代码,该代码生成两个日期:

public abstract class BaseFragment extends Fragment {

  ...
  public void explainDays(int totalDays) {

    Calendar calendar = Calendar.getInstance();
    Date start = calendar.getTime();

    calendar.add(Calendar.DATE, -totalDays);
    Date end = calendar.getTime();

    Log.e("startDate", String.valueOf(start));
    Log.e("endDate", String.valueOf(end));

  }

}

从上面的代码中,我得到了以下三个日志:

E/totalLOS: 1233
E/startDate: Mon Jun 08 19:45:08 GMT+07:00 2020
E/endDate: Sun Jan 22 19:45:08 GMT+07:00 2017

如何在这两个日期结果之间生成诸如自2007年以来的1年零5个月之类的响应? 自2007年以来的需要从上面的“日志”中的 endDate 中提取。

任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:3)

java.time

您可以执行以下操作:

import java.time.OffsetDateTime;
import java.time.Period;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Define format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O yyyy");

        // Date/time strings
        String strEndDate = "Mon Jun 08 19:45:08 GMT+07:00 2020";
        String strStartDate = "Sun Jan 22 19:45:08 GMT+07:00 2017";

        // Define ZoneOffset
        ZoneOffset zoneOffset = ZoneOffset.ofHours(6);

        // Parse date/time strings into OffsetDateTime
        OffsetDateTime startDate = OffsetDateTime.parse(strStartDate, formatter).withOffsetSameLocal(zoneOffset);
        OffsetDateTime endDate = OffsetDateTime.parse(strEndDate, formatter).withOffsetSameLocal(zoneOffset);

        // Calculate period between `startDate` and `endDate`
        Period period = Period.between(startDate.toLocalDate(), endDate.toLocalDate());

        // Display result
        System.out.println(
                period.getYears() + " years and " + period.getMonths() + " months since " + startDate.getYear());
    }
}

输出:

3 years and 4 months since 2017

注意:不要使用过时的java.util.DateSimpleDateFormat,而要使用现代的日期/时间API。选中this,以了解更多信息。


注意:以下内容已从How to get start time and end time of a day in another timezone in Android

复制而来

问题:java.time是否不需要Android API级别26?

java.time在旧的和更新的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(用于JSR 310的ThreeTen;请参见底部的链接)。
  • 在旧版Android上,请使用Android版的ThreeTen Backport。称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

但是除了切换到ThreeTenBP之外,我们没有其他选择 图书馆?

如果您坚持,我想可以找到使用CalendarDateSimpleDateFormat的方法。这些类的设计很差,而且已经过时,因此,根据我所知道和不知道的知识,我更喜欢ThreeTenABP。

链接


答案 1 :(得分:0)

如果您可以从两个日期中提取月,日和年,则可以使用以下解决方案计算两个日期之间的确切差值。

            int sday=22 //int day of month here
            int smonth=1 //int month here
            int syear=2017 //int year here

            int eday=5 //int day of month here
            int emonth=6 //int month here
            int eyear=2020 //int year here

                resyear = eyear - syear;
                if (emonth >= smonth) {
                    resmonth = emonth - smonth;
                } else {
                    resmonth = emonth - smonth;
                    resmonth = 12 + resmonth;
                    resyear--;
                }
                if (eday >= sday) {
                    resday = eday - sday;
                } else {
                    resday = eday - sday;
                    resday = 31 + resday;
                    if (resmonth == 0) {
                        resmonth = 11;
                        resyear--;
                    } else {
                        resmonth--;
                    }
                }
                if (resday <0 || resmonth<0 || resyear<0) {
                    Toast.makeText(getApplicationContext(), "starting date must greater than ending date", Toast.LENGTH_LONG).show();

                }
                else {

Toast.makeText(getApplicationContext(), "difference: " + resyear + " years /" + resmonth + " months/" + resday + " days", Toast.LENGTH_LONG).show();

                }
            }