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 模式下具有超出范围的值。