15

如何在 Android 中获取两个日期之间的所有日期。

例如。我有两个字符串。

String first="2012-07-15";  
String second="2012-07-21"; 

我从这些字符串中转换并获取日期。

DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");                                    
DateFormat df2 = new SimpleDateFormat("MMM dd");
String mydate = df2.format(df1.parse(first));

这样我就可以从第一个和第二个字符串中获取日期。

现在我还显示这两个日期之间的所有日期。

4

5 回答 5

49

最好不要在日期计算中使用任何硬编码值。我们可以依靠javaCalendar类方法来完成这个任务

看代码

private static List<Date> getDates(String dateString1, String dateString2)
{
    ArrayList<Date> dates = new ArrayList<Date>();
    DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");

    Date date1 = null;
    Date date2 = null;

    try {
        date1 = df1 .parse(dateString1);
        date2 = df1 .parse(dateString2);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(date1);


    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(date2);

    while(!cal1.after(cal2))
    {
        dates.add(cal1.getTime());
        cal1.add(Calendar.DATE, 1);
    }
    return dates;
}

并如下使用它

    List<Date> dates = getDates("2012-02-01", "2012-03-01");
    for(Date date:dates)
        System.out.println(date);
于 2012-07-10T12:43:30.193 回答
1
public class DummyWorks extends Activity 
{
static final long ONE_DAY = 24 * 60 * 60 * 1000L;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getDatesBetween("03/23/2011","03/28/2011");
}

public static void getDatesBetween(String startDate,String endDate) {


    long  from=Date.parse(startDate);  

    long to=Date.parse(endDate);  

    int x=0;

    while(from <= to) {
          x=x+1;
          System.out.println ("Dates  : "+new Date(from));
          from += ONE_DAY;
    }
    System.out.println ("No of Dates  :"+ x);


 }
}
于 2012-07-10T12:00:05.340 回答
1

Kotlin 中的解决方案:它将返回两个日期之间的日期列表。

 fun getDatesBetween(dateString1:String, dateString2:String):List<String> {
        val dates = ArrayList<String>()
        val input = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
        var date1:Date? = null
        var date2:Date? = null
        try
        {
            date1 = input.parse(dateString1)
            date2 = input.parse(dateString2)
        }
        catch (e:ParseException) {
            e.printStackTrace()
        }
        val cal1 = Calendar.getInstance()
        cal1.time = date1
        val cal2 = Calendar.getInstance()
        cal2.time = date2
        while (!cal1.after(cal2))
        {
            val output = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
            dates.add(output.format(cal1.time))
            cal1.add(Calendar.DATE, 1)
        }
        return dates
    }
于 2021-05-06T12:54:50.823 回答
1

java.time 通过脱糖

考虑为您的日期工作使用现代 Java 日期和时间 API java.time。LocalDate是用于日期的类(没有时间)。我假设您想要所有日期,包括两个给定的日期。

    String first = "2012-07-15";
    String second = "2012-07-21";
    
    List<LocalDate> dates = LocalDate.parse(first)
            .datesUntil(LocalDate.parse(second).plusDays(1))
            .collect(Collectors.toList());
    
    System.out.println(dates);

输出:

[2012-07-15、2012-07-16、2012-07-17、2012-07-18、2012-07-19、2012-07-20、2012-07-21]

LocalDate.datesUntil()为我们提供了包括指定结束日期的日期流,因此我们需要在其中添加一天以包含它。

我正在利用您的字符串采用 ISO 8601 格式并将LocalDate此格式解析为其默认格式的事实,即没有任何显式格式化程序。

或通过 ThreeTenABP

如果由于某种原因您使用的是 ThreeTenABP 库而不是脱糖,我相信该datesUntil方法不存在。在这种情况下,请改用循环。

    List<LocalDate> dates = new ArrayList<>();
    LocalDate currentDate = LocalDate.parse(first);
    LocalDate lastDate = LocalDate.parse(second);
    while (! currentDate.isAfter(lastDate )) {
        dates.add(currentDate);
        currentDate = currentDate.plusDays(1);
    }

[2012-07-15、2012-07-16、2012-07-17、2012-07-18、2012-07-19、2012-07-20、2012-07-21]

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

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,要么使用脱糖,要么使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保您从org.threeten.bp子包中导入日期和时间类。

链接

于 2021-07-03T09:38:21.747 回答
0
        val currentDateCalendar = Calendar.getInstance()
        val mCurrentDate = getDateChanger(currentDateCalendar.time, "yyyy-MM-dd")
        currentDateCalendar.add(Calendar.MONTH, 1)
        val oneMonthNextCalendar = currentDateCalendar
        val mNextDate = getDateChanger(oneMonthNextCalendar.time, "yyyy-MM-dd")

        val mDates = datesBetween(
            mCurrentDate,
            mNextDate,
            "yyyy-MM-dd"
        )
        for (date in mDates)
            Log.i("DatesBetween",date)





 @SuppressLint("SimpleDateFormat")
    fun getDateChanger(mDate:Date,formatter: String): String {
        val dateFormat = SimpleDateFormat(formatter)
        return dateFormat.format(mDate)
    }

    @SuppressLint("SimpleDateFormat")
    fun datesBetween(startDate: String, endDate: String,formatter: String): List<String> {
        val dates = ArrayList<String>()
        val dateFormat: DateFormat = SimpleDateFormat(formatter)
        var sDate: Date? = null
        var eDate: Date? = null
        try {
            sDate = dateFormat.parse(startDate)
            eDate = dateFormat.parse(endDate)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        val sCalendarDate = Calendar.getInstance()
        sCalendarDate.time = sDate!!
        val eCalendarDate = Calendar.getInstance()
        eCalendarDate.time = eDate!!
        while (!sCalendarDate.after(eCalendarDate)) {
            dates.add(dateFormat.format(sCalendarDate.time))
            sCalendarDate.add(Calendar.DATE, 1)
        }
        return dates
    }
于 2021-07-03T07:08:28.610 回答