62,614
社区成员
发帖
与我相关
我的任务
分享
package javase1day05;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateCalDemo {
public static void main(String[] args) {
//时间计算的原理
long now = System.currentTimeMillis();
long l = now+1000L*60*60*24;//明天
System.out.println(l);
SimpleDateFormat fmt =
new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = new GregorianCalendar();
cal.add(Calendar.MONTH, 5);
System.out.println(fmt.format(cal.getTime()));
cal.add(Calendar.YEAR, 5);//1387260478395
System.out.println(fmt.format(cal.getTime()));
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(fmt.format(cal.getTime()));
}
}
System.out.println(fmt.format(cal.getTime()));
,得到的结果是2018年12月10日,但是从日历上来看应该 是2018年12月17日。如果我把fmt.format(cal.getTime())单独提出去的话,得到的结果是正确的。System.out.println(fmt.format(cal.getTime()));
,对结果却是没有影响的,如果日历字段值中存在任何冲突,则 Calendar 将为最近设置的日历字段提供优先权。以下是日历字段的默认组合。将使用由最近设置的单个字段所确定的最近组合。
对于日期字段:
YEAR + MONTH + DAY_OF_MONTH
YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
YEAR + DAY_OF_YEAR
YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
package javase1day05;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateCalDemo {
public static void main(String[] args) {
// 时间计算的原理
long now = System.currentTimeMillis();
long l = now + 1000L * 60 * 60 * 24;// 明天
System.out.println(l);
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(fmt.format(new Date(l)));
Calendar cal = new GregorianCalendar();
cal.add(Calendar.MONTH, 5);
System.out.println(fmt.format(cal.getTime()));
cal.add(Calendar.YEAR, 5);
//System.out.println(fmt.format(cal.getTime()));
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(fmt.format(cal.getTime()));
}
}
/*
* 输出结果:
*1374195228233
*2013-07-19
*2013-12-18
*2018-12-10
*/
这是把倒数第二个输出注释掉的的,package javase1day05;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateCalDemo {
public static void main(String[] args) {
// 时间计算的原理
long now = System.currentTimeMillis();
long l = now + 1000L * 60 * 60 * 24;// 明天
System.out.println(l);
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(fmt.format(new Date(l)));
Calendar cal = new GregorianCalendar();
cal.add(Calendar.MONTH, 5);
System.out.println(fmt.format(cal.getTime()));
cal.add(Calendar.YEAR, 5);
System.out.println(fmt.format(cal.getTime()));
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(fmt.format(cal.getTime()));
}
}
/*1374195414804
*2013-07-19
*2013-12-18
*2018-12-18
*2018-12-17
*/
这是不注释掉倒数第二个输出语句的结果,前后结果相差一周。另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。在 JavaDoc 中有下面的例子来说明这个问题:
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1
cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30
System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录
大家可以参考下这一段,我大致知道为什么会出错了,但是就是不知道为什么API里明明说了调用add()方法会立即计算时间值,但是结果却是没有立即调用,很费解
set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。
API里看到Calendar类的说明里有这段,不是太懂,应该是你把第二个getTime()注释掉的话,set()在重新计算毫秒数前改变了日期
具体的也不太懂,坐等高人1374134082741
2013-12-17
2018-12-17
2018-12-17
成功构建 (总时间: 0 秒)
铁运行结果
public class TestDate {
public static void main(String[] args) {
// 时间计算的原理
long now = System.currentTimeMillis();
long l = now + 1000L * 60 * 60 * 24;// 明天
System.out.println(l);
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = new GregorianCalendar();
cal.add(Calendar.MONTH, 5);
System.out.println(fmt.format(cal.getTime()));
cal.add(Calendar.YEAR, 5);// 1387260478395
System.out.println(fmt.format(cal.getTime()));
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(fmt.format(cal.getTime()));
}
}
/*
* 输出结果:
* 1374133763448
* 2013-12-17
* 2018-12-17
* 2018-12-17
*
*/
我用的是JDK1.7,楼主再试试看,调试一下编译环境等,应该没有什么问题的。