在Android中生成两个日期之间的日期

时间:2012-07-10 11:51:04

标签: android datetime date android-date

如何在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));

这样我从第一个和第二个字符串中得到两个日期。

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

5 个答案:

答案 0 :(得分:33)

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

查看代码

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);

答案 1 :(得分: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);


 }
}

答案 2 :(得分:1)

        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
    }

答案 3 :(得分:0)

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

 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
    }

答案 4 :(得分:0)

java.time 通过脱糖

考虑使用 java.time(现代 Java 日期和时间 API)进行日期工作。 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 for JSR 310;请参阅底部的链接)。
  • 在较旧的 Android 上,使用脱糖或 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间类。

链接