Android日历:获取接下来的七天详细信息 - 日期和月份给出了IllegalArgumentException

时间:2014-01-06 16:57:22

标签: java android calendar illegalargumentexception

目标:获取接下来的七天(包括当天)。 我正在使用Calendar类的add(int field,int value)方法。

代码:

Calendar cal = Calendar.getInstance();

for (int i = 0; i < 7; i++){

    int index = cal.get(Calendar.DAY_OF_WEEK) - 1;
    String text = cal.get(Calendar.DATE) + " " +cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.getDefault());
    cal.add(cal.get(Calendar.DAY_OF_MONTH), 1);
    Log.d(TAG, text);

}

引发IllegalArgumentException。 根据{{​​3}},如果字段为ZONE_OFFSET或DST_OFFSET,则抛出此异常。

logcat的:

E/AndroidRuntime(17841): Caused by: java.lang.IllegalArgumentException
E/AndroidRuntime(17841):    at java.util.GregorianCalendar.add(GregorianCalendar.java:357)

4 个答案:

答案 0 :(得分:2)

您应该使用

cal.add(Calendar.DAY_OF_MONTH, 1);

该方法的第一个参数是要添加的日期字段。

您将该字段的值作为字段标识符传递。它可能超过了ZONE_OFFSET的价值。

答案 1 :(得分:0)

answer by Sotirios Delimanolis是正确的。


仅供参考,使用Joda-Time库可以更轻松地完成这种日期工作。

以下是一些使用Joda-Time 2.3和Java 7的示例代码。我使用了巴黎时区和法国语言区域,但您可以使用自己的区域代替。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

// Specify time zone rather than rely on default.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );

// Joda-Time offers many formatters, plus you may define your own.
// Using "forStyle" approach, pass first letter of the word Short/Medium/Long/Full, first for date and then for time.
DateTimeFormatter formatter = DateTimeFormat.forStyle( "MM" ).withLocale( Locale.FRANCE ).withZone( timeZone );

DateTime now = new DateTime(  timeZone );
for (int i = 0; i < 7; i++){
    DateTime dateTime = now.plusDays( i );

    // Extract descriptions.
    String dayOfWeekAsText = dateTime.dayOfWeek().getAsText( Locale.FRANCE );
    String monthAsText = dateTime.monthOfYear().getAsText( Locale.FRANCE );
    String dateTimeAsText = formatter.print( dateTime );

    // Dump to console.
    System.out.println( "dayOfWeekAsText: " + dayOfWeekAsText );
    System.out.println( "monthAsText: " + monthAsText );
    System.out.println( "dateTimeAsText: " + dateTimeAsText );
    System.out.println(); // Blank line.
}

跑步时......

dayOfWeekAsText: lundi
monthAsText: janvier
dateTimeAsText: 6 janv. 2014 18:35:18

dayOfWeekAsText: mardi
monthAsText: janvier
dateTimeAsText: 7 janv. 2014 18:35:18

dayOfWeekAsText: mercredi
monthAsText: janvier
dateTimeAsText: 8 janv. 2014 18:35:18

dayOfWeekAsText: jeudi
monthAsText: janvier
dateTimeAsText: 9 janv. 2014 18:35:18

dayOfWeekAsText: vendredi
monthAsText: janvier
dateTimeAsText: 10 janv. 2014 18:35:18

dayOfWeekAsText: samedi
monthAsText: janvier
dateTimeAsText: 11 janv. 2014 18:35:18

dayOfWeekAsText: dimanche
monthAsText: janvier
dateTimeAsText: 12 janv. 2014 18:35:18

答案 2 :(得分:0)

在找到一种简单的方法之前,我一直在遇到相同的问题,只需使用日历实例 Roll 方法,它将日期增加一个或您一个可以指定增量金额,以真实的看跌期权交易日间隔为单位,负值表示减量。 kotlin中的代码如下

 val calendar = Calendar.getInstance()
               for(i in 0..6){
                   calendar.roll(Calendar.DATE,true)
                   println(getDateInstance().format(calendar.time))
               }

结果就像

I/System.out: Jun 11, 2019
I/System.out: Jun 12, 2019
I/System.out: Jun 13, 2019
I/System.out: Jun 14, 2019
I/System.out: Jun 15, 2019
I/System.out: Jun 16, 2019
I/System.out: Jun 17, 2019

希望有帮助

答案 3 :(得分:-1)

使用以下代码

 class CalenderService extends AsyncTask
{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        DayList=new ArrayList<>();
    }

    @Override
    protected Object doInBackground(Object[] params) {

        SimpleDateFormat sdf = new SimpleDateFormat("EEE");
        Date d = new Date();
        for (int i=0;i<7;i++)
        {
            Calendar cal=Calendar.getInstance();
            cal.setTime(d);
            cal.add(Calendar.DAY_OF_WEEK,i);

            Date dayweek=cal.getTime();

            String NextDay=sdf.format(dayweek);
            int nxtday=dayweek.getDate();



            ED=new Everydays(nxtday,NextDay);
            DayList.add(ED);

        }
        return null;
    }


    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        for (int i=0;i<DayList.size();i++)
        {
            Toast.makeText(getApplicationContext(),String.valueOf(DayList.get(i).nxtday)+" "+DayList.get(i).nextDay,Toast.LENGTH_SHORT).show();


        }

    }
}