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

Posted

技术标签:

【中文标题】在Android中生成两个日期之间的日期【英文标题】:generate dates between two date in 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));

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

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

【问题讨论】:

How can I increment a date by one day in Java? 的可能重复项 - 您可以在循环中运行增量以创建日期系列。 可能在 Android 中尚不可用,但在常规 Java 中使用 LocalDate::datesUntil: LocalDate.parse( "2012-07-15" ).datesUntil( "2012-07-21" ) 会产生 Stream<LocalDate> 对于该问题的新读者,我建议您不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的LocalDateDateTimeFormatter 【参考方案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 导入日期和时间类。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了 java.time。 ThreeTen Backport project,java.time 的反向移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 Java 8+ APIs available through desugaring ThreeTenABP,Android 版 ThreeTen Backport Question: How to use ThreeTenABP in Android Project,解释得很透彻。 Wikipedia article: ISO 8601

【讨论】:

【参考方案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
    

【讨论】:

以上是关于在Android中生成两个日期之间的日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在Oracle中生成一周的第一天,一周的最后一天和两个日期之间的周数

在按周分组的 2 个日期之间在 MYSQL 中生成报告

在 Oracle 中生成具有 2 个日期之间时间间隔的行

在 HIVE 中生成日期系列时,将有效日期限制为今天

在熊猫中生成给定范围内的随机日期

在bash中生成特定日期