问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java推算日期*?比如说今天是3月7号,推算24天后是3月31号,但是推算到25天后输出日期就变成二月十号了

发布网友 发布时间:2022-05-03 11:49

我来回答

2个回答

热心网友 时间:2023-10-21 11:02

不会啊,你自己算错了吧
import java.util.Calendar;
import java.util.Date;

public class ABC {

public static void main(String[] args) {

Date date = new Date(2011, 3-1, 7);//JAVA里面月份是从0开始的,所以3月份要用2来表示
int julianDay = 24;

Date date2 = getDaysAfter(date, julianDay);
System.out.println(date2);
julianDay = 25;
date2 = getDaysAfter(date, julianDay);
System.out.println(date2);

}

private static Date getDaysAfter(Date date, int julianDay) {

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, julianDay);

return cal.getTime();
}
}

---------------
Fri Mar 31 00:00:00 CST 3911
Sat Apr 01 00:00:00 CST 3911

你的出错原因在于,int days = 25,修改为long days = 25即可。
JAVA连续乘法的时候,24*60*60*60*1000发生了int溢出,所以出错。追问大哥,你看清楚啊 那个days只是连续乘法里面的一个参数啊,乘法的结果在这里
long result = timeone + days*24*60*60*1000;
这个应该不会溢出吧?
而且我照着你说的把int换成long了还是不行啊!帮忙看看吧!

追答是你的dasy*24*60*60*1000这个结果发生了int溢出。
days改成long days = 25; JDK 1.5下的运行结果

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
System.out.println("Now Date is-->" + sdf.format(now));
Calendar cal = Calendar.getInstance();
cal.setTime(now);
long days = 25;
long timeone = cal.getTimeInMillis();
long result = timeone + days * 24 * 60 * 60 * 1000;
Date getDate = new Date(result);
System.out.println("result time-->" + sdf.format(getDate));

---------
Now Date is-->2011-03-07 16:03:32
result time-->2011-04-01 16:04:32

热心网友 时间:2023-10-21 11:02

GregorianCalendar calender = new GregorianCalendar();
System.out.println(calender.get(Calendar.YEAR) + ":" + (int) (calender.get(Calendar.MONTH) + 1) + ":" + calender.get(Calendar.DAY_OF_MONTH));
calender.roll(Calendar.DATE, +8);
System.out.println(calender.get(Calendar.YEAR) + ":" + (int) (calender.get(Calendar.MONTH) + 1) + ":" + calender.get(Calendar.DAY_OF_MONTH));

详细你要看api文档里面有一个详细说明。
void roll(int field,
int amount)向指定日历字段添加有符号的时间量,不更改更大的字段。负的波动量表示从字段减去时间量,不更改更大的字段。如果指定的量为 0,则此方法不执行任何操作。
此方法在添加时间量前调用 Calendar.complete(),使得所有的日历字段都标准化。如果任何日历字段在 non-lenient 模式下具有超出范围的值,则抛出 IllegalArgumentException。

示例:考虑原来设置为 1999 年 8 月 31 日的 GregorianCalendar 。现在调用 roll(Calendar.MONTH, 8) 将该日历设置为 1999 年 4 月 30 日。如果使用 GregorianCalendar,则 4 月份的 DAY_OF_MONTH 字段不可能为 31。将 DAY_OF_MONTH 设置为最可能接近的值 30。YEAR 字段保持为值 1999,因为它是一个比 MONTH 更大的字段。

示例:考虑原来设置为 1999 年 6 月 6 日星期日的 GregorianCalendar 。现在调用 roll(Calendar.WEEK_OF_MONTH, -1) 将该日历设置为 1999 年 6 月 1 日星期二,而调用 add(Calendar.WEEK_OF_MONTH, -1) 则将日历设置为 1999 年 5 月 30 日星期日。这是因为上升和下降规则施加了其他的约束:WEEK_OF_MONTH 改变时 MONTH 必须不变。根据添加规则 1,所得日期必定在 6 月 1 日星期二和 6 月 5 日星期六之间。根据添加规则 2,DAY_OF_WEEK(在改变 WEEK_OF_MONTH 时它是一个不变量)被设置为 Tuesday,是最接近 Sunday 的可能值(其中星期日是一个星期的第一天)。

覆盖:
类 Calendar 中的 roll
参数:
field - 日历字段。
amount - 添加到 field 的有符号时间量。
抛出:
IllegalArgumentException - 如果 field 为 ZONE_OFFSET、DST_OFFSET 或未知,或者任何日历字段在 non-lenient 模式下具有超出范围的值。

热心网友 时间:2023-10-21 11:02

不会啊,你自己算错了吧
import java.util.Calendar;
import java.util.Date;

public class ABC {

public static void main(String[] args) {

Date date = new Date(2011, 3-1, 7);//JAVA里面月份是从0开始的,所以3月份要用2来表示
int julianDay = 24;

Date date2 = getDaysAfter(date, julianDay);
System.out.println(date2);
julianDay = 25;
date2 = getDaysAfter(date, julianDay);
System.out.println(date2);

}

private static Date getDaysAfter(Date date, int julianDay) {

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, julianDay);

return cal.getTime();
}
}

---------------
Fri Mar 31 00:00:00 CST 3911
Sat Apr 01 00:00:00 CST 3911

你的出错原因在于,int days = 25,修改为long days = 25即可。
JAVA连续乘法的时候,24*60*60*60*1000发生了int溢出,所以出错。追问大哥,你看清楚啊 那个days只是连续乘法里面的一个参数啊,乘法的结果在这里
long result = timeone + days*24*60*60*1000;
这个应该不会溢出吧?
而且我照着你说的把int换成long了还是不行啊!帮忙看看吧!

追答是你的dasy*24*60*60*1000这个结果发生了int溢出。
days改成long days = 25; JDK 1.5下的运行结果

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
System.out.println("Now Date is-->" + sdf.format(now));
Calendar cal = Calendar.getInstance();
cal.setTime(now);
long days = 25;
long timeone = cal.getTimeInMillis();
long result = timeone + days * 24 * 60 * 60 * 1000;
Date getDate = new Date(result);
System.out.println("result time-->" + sdf.format(getDate));

---------
Now Date is-->2011-03-07 16:03:32
result time-->2011-04-01 16:04:32

热心网友 时间:2023-10-21 11:02

GregorianCalendar calender = new GregorianCalendar();
System.out.println(calender.get(Calendar.YEAR) + ":" + (int) (calender.get(Calendar.MONTH) + 1) + ":" + calender.get(Calendar.DAY_OF_MONTH));
calender.roll(Calendar.DATE, +8);
System.out.println(calender.get(Calendar.YEAR) + ":" + (int) (calender.get(Calendar.MONTH) + 1) + ":" + calender.get(Calendar.DAY_OF_MONTH));

详细你要看api文档里面有一个详细说明。
void roll(int field,
int amount)向指定日历字段添加有符号的时间量,不更改更大的字段。负的波动量表示从字段减去时间量,不更改更大的字段。如果指定的量为 0,则此方法不执行任何操作。
此方法在添加时间量前调用 Calendar.complete(),使得所有的日历字段都标准化。如果任何日历字段在 non-lenient 模式下具有超出范围的值,则抛出 IllegalArgumentException。

示例:考虑原来设置为 1999 年 8 月 31 日的 GregorianCalendar 。现在调用 roll(Calendar.MONTH, 8) 将该日历设置为 1999 年 4 月 30 日。如果使用 GregorianCalendar,则 4 月份的 DAY_OF_MONTH 字段不可能为 31。将 DAY_OF_MONTH 设置为最可能接近的值 30。YEAR 字段保持为值 1999,因为它是一个比 MONTH 更大的字段。

示例:考虑原来设置为 1999 年 6 月 6 日星期日的 GregorianCalendar 。现在调用 roll(Calendar.WEEK_OF_MONTH, -1) 将该日历设置为 1999 年 6 月 1 日星期二,而调用 add(Calendar.WEEK_OF_MONTH, -1) 则将日历设置为 1999 年 5 月 30 日星期日。这是因为上升和下降规则施加了其他的约束:WEEK_OF_MONTH 改变时 MONTH 必须不变。根据添加规则 1,所得日期必定在 6 月 1 日星期二和 6 月 5 日星期六之间。根据添加规则 2,DAY_OF_WEEK(在改变 WEEK_OF_MONTH 时它是一个不变量)被设置为 Tuesday,是最接近 Sunday 的可能值(其中星期日是一个星期的第一天)。

覆盖:
类 Calendar 中的 roll
参数:
field - 日历字段。
amount - 添加到 field 的有符号时间量。
抛出:
IllegalArgumentException - 如果 field 为 ZONE_OFFSET、DST_OFFSET 或未知,或者任何日历字段在 non-lenient 模式下具有超出范围的值。

热心网友 时间:2023-10-21 11:02

不会啊,你自己算错了吧
import java.util.Calendar;
import java.util.Date;

public class ABC {

public static void main(String[] args) {

Date date = new Date(2011, 3-1, 7);//JAVA里面月份是从0开始的,所以3月份要用2来表示
int julianDay = 24;

Date date2 = getDaysAfter(date, julianDay);
System.out.println(date2);
julianDay = 25;
date2 = getDaysAfter(date, julianDay);
System.out.println(date2);

}

private static Date getDaysAfter(Date date, int julianDay) {

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, julianDay);

return cal.getTime();
}
}

---------------
Fri Mar 31 00:00:00 CST 3911
Sat Apr 01 00:00:00 CST 3911

你的出错原因在于,int days = 25,修改为long days = 25即可。
JAVA连续乘法的时候,24*60*60*60*1000发生了int溢出,所以出错。追问大哥,你看清楚啊 那个days只是连续乘法里面的一个参数啊,乘法的结果在这里
long result = timeone + days*24*60*60*1000;
这个应该不会溢出吧?
而且我照着你说的把int换成long了还是不行啊!帮忙看看吧!

追答是你的dasy*24*60*60*1000这个结果发生了int溢出。
days改成long days = 25; JDK 1.5下的运行结果

Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
System.out.println("Now Date is-->" + sdf.format(now));
Calendar cal = Calendar.getInstance();
cal.setTime(now);
long days = 25;
long timeone = cal.getTimeInMillis();
long result = timeone + days * 24 * 60 * 60 * 1000;
Date getDate = new Date(result);
System.out.println("result time-->" + sdf.format(getDate));

---------
Now Date is-->2011-03-07 16:03:32
result time-->2011-04-01 16:04:32

热心网友 时间:2023-10-21 11:02

GregorianCalendar calender = new GregorianCalendar();
System.out.println(calender.get(Calendar.YEAR) + ":" + (int) (calender.get(Calendar.MONTH) + 1) + ":" + calender.get(Calendar.DAY_OF_MONTH));
calender.roll(Calendar.DATE, +8);
System.out.println(calender.get(Calendar.YEAR) + ":" + (int) (calender.get(Calendar.MONTH) + 1) + ":" + calender.get(Calendar.DAY_OF_MONTH));

详细你要看api文档里面有一个详细说明。
void roll(int field,
int amount)向指定日历字段添加有符号的时间量,不更改更大的字段。负的波动量表示从字段减去时间量,不更改更大的字段。如果指定的量为 0,则此方法不执行任何操作。
此方法在添加时间量前调用 Calendar.complete(),使得所有的日历字段都标准化。如果任何日历字段在 non-lenient 模式下具有超出范围的值,则抛出 IllegalArgumentException。

示例:考虑原来设置为 1999 年 8 月 31 日的 GregorianCalendar 。现在调用 roll(Calendar.MONTH, 8) 将该日历设置为 1999 年 4 月 30 日。如果使用 GregorianCalendar,则 4 月份的 DAY_OF_MONTH 字段不可能为 31。将 DAY_OF_MONTH 设置为最可能接近的值 30。YEAR 字段保持为值 1999,因为它是一个比 MONTH 更大的字段。

示例:考虑原来设置为 1999 年 6 月 6 日星期日的 GregorianCalendar 。现在调用 roll(Calendar.WEEK_OF_MONTH, -1) 将该日历设置为 1999 年 6 月 1 日星期二,而调用 add(Calendar.WEEK_OF_MONTH, -1) 则将日历设置为 1999 年 5 月 30 日星期日。这是因为上升和下降规则施加了其他的约束:WEEK_OF_MONTH 改变时 MONTH 必须不变。根据添加规则 1,所得日期必定在 6 月 1 日星期二和 6 月 5 日星期六之间。根据添加规则 2,DAY_OF_WEEK(在改变 WEEK_OF_MONTH 时它是一个不变量)被设置为 Tuesday,是最接近 Sunday 的可能值(其中星期日是一个星期的第一天)。

覆盖:
类 Calendar 中的 roll
参数:
field - 日历字段。
amount - 添加到 field 的有符号时间量。
抛出:
IllegalArgumentException - 如果 field 为 ZONE_OFFSET、DST_OFFSET 或未知,或者任何日历字段在 non-lenient 模式下具有超出范围的值。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
报错Warning: Trying to access array offset on value of type boo... ...with message 'Illegal string offset 'BindStartDate''_百度... 网站导航出现 Warning: Illegal string offset 'parentid' in_百度... PHP提示 Warning: Illegal string offset 'name' in在XX目录下的文件... 心情压抑了,得不到释放该怎么办?拜托各位了3Q 怎样暗示我的女生 我喜欢她 要提示的 我很内向拜托各位了 3Q_百度... 你好,阿富汗内容简介 闺怨诗词古名句鉴赏(15首经典闺怨诗) 钢琴考级一到十级 ...开机密码忘了不能用指纹除了刷机还有办法吗在线等很急 万科也降价了 衡水房价会降吗 1991年日历表阴历3月7日是阳历多少 衡水房价会落吗 3月7日生日命运,三月七日是什么星座 衡水房价多少钱一平 1995年农历3月7日生的,请问阳历生日是什么,又是什么星座呢? 身份证上2002年三月初七是几月几号过生日? 衡水房价 打算2012年或13年在衡水买房子,不知道衡水的房价是什么走势?还有在哪个地段的房子比较好? 2oo1年3月7号是农历几月几日 衡水房价都知道涨的很高了,但是为什么还那么 2014年的农历三月初七是在日历的几月几日 二月初二是几月几号啊? 衡水市现在房价多少啊? 3月7日是2020年的第九周吗? 河北衡水房价会不会降价? 1955年阳历3月7号阴历是多少号 衡水房价2022年会处于什么趋势 日历1976农历3月7日是什么星座 求直齿轮和圆柱组合体的三视图 衡水房价怎么样?今年买楼是否可以? 衡水房价多少 农历3月初7是什么星座 廊坊、固安、衡水、保定的房价现在是多少? 3月7日可否砍树 衡水的房价还会涨吗 手机日历从明天2月9到下月3月7号的下面带点的是什么意思? 河北衡水冀州市的房价还会再长吗? 日历1983年3 月7日17点生于河南驻马店上升星座是什么??? 房价-衡水的房价会降价吗 股票10转5股派8元含税是什么意思 边缘户致贫风险消除会议记录怎么写?- 问一问 边缘户致贫风险消除会议记录怎么写? 村两委对贫困人口识别会议记录怎么写? 村两委班子参会怎么写? 漏报春季雨露计划贫困生一学期的村两委会议记录怎么写 村发包机动地开两委会会议记录怎么写 新一届村两委班子参选人员考察对象测评会议记录怎么写? 我在12306里面添加乘车人,如果我在别的帐号添加过了,还需要去火车站激活吗? 男生喜欢你的细节表现