目标:获取接下来的七天(包括当天)。 我正在使用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)
答案 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();
}
}
}