【问题标题】:generate dates between two date in Android在Android中生成两个日期之间的日期
【发布时间】:2012-07-09 21:27:24
【问题描述】:

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

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

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

【问题讨论】:

标签: android datetime date android-date


【解决方案1】:

最好不要在日期计算中使用任何硬编码值。我们可以依靠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);

【讨论】:

  • DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); 这一行对我来说是不兼容的类型。当我将其更改为 SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); 时,它对我有用
  • @AkhilaMadari 你必须使用 java.text.DateFormatjava.text.SimpleDateFormat 类。请检查您是否从正确的包中导入了类。
  • 完美解决方案
【解决方案2】:
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);


 }
}

【讨论】:

  • 由于夏令时和其他奇怪的时区变化,将毫秒添加到您的日期会带来很高的失败风险。
  • 感谢@assylias,现在我对其进行了测试。更改“long ONE_DAY”后得到正确结果
  • 你好@Ramkiran 感谢您的回复。但我在long from = Date.parse(startDate); 遇到错误,它说 java.util.Date.parse 处的 java.illegalArgumentException。
  • 我的日期格式是 2012-07-15。我需要用你的日期格式格式化它吗?我在这个函数中添加了什么?
  • 是的,我认为这就是我出错的原因。 getDatesBetween() 函数有什么变化?
【解决方案3】:

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
    }

【讨论】:

    【解决方案4】:

    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,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
    • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间类。

    链接

    【讨论】:

      【解决方案5】:
              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
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2015-10-01
        • 2010-10-07
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多