日期类Calendar遇到的问题总结

1.获取月份时候,Calendar.MONTH需要+1

Calendar.MONTH返回的是当前月距离第一个月的差值,而Java中第一个月JANUARY是0,所以需要+1

代码:

//创建日期
Date date = new Date();

//显示现在时间
String time = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSSS")).format(date);
System.out.println("现在时间: " + time);

//创建Calendar对象并设置现在时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

System.out.println("1月份返回的是: " + Calendar.JANUARY);
System.out.println("返回的月份是: " + calendar.get(Calendar.MONTH));
System.out.println("实际的月份是: " + (calendar.get(Calendar.MONTH) + 1));

结果:

现在时间: 2017-07-06 11:23:19:0954
1月份返回的是: 0
返回的月份是: 6
实际的月份是: 7

2.给Calendar设置固定的时间

2.1.先给Date设置固定时间,再间接给Calendar设置

代码:

//创建格式化标准
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
    //设置固定时间,parse返回date类型
    Date date = simpleDateFormat.parse("2017-7-6 11:28:33");
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    //按照固定格式显示设置的时间
    String time = simpleDateFormat.format(calendar.getTime());
    System.out.println(time);
} catch (ParseException e) {
    e.printStackTrace();
}

结果:

2017-07-06 11:28:33

2.2.直接设置年月日时分秒

代码:

//创建格式化标准
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.set(2017, 7 - 1, 6, 11, 28, 33);//注意月份要-1,否则结果会大一个月
//按照固定格式显示设置的时间
String time = simpleDateFormat.format(calendar.getTime());
System.out.println(time);

结果:

2017-07-06 11:28:33

3.获取Calendar的时间参数

3.1.时间参数获取

代码:

//创建日期
Date date = new Date();

//显示现在时间
String time = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSSS")).format(date);
System.out.println("现在时间: " + time);

//创建Calendar对象并设置现在时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

System.out.println("年: " + calendar.get(Calendar.YEAR));
System.out.println("月: " + (calendar.get(Calendar.MONTH) + 1));

System.out.println("本年第几天: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("本月第几天: " + calendar.get(Calendar.DAY_OF_MONTH));//日

calendar.add(Calendar.HOUR_OF_DAY, 1);
System.out.println("1个小时以后: " + calendar.get(Calendar.HOUR));

calendar.add(Calendar.MONTH, -3);
System.out.println("3个月之前: " + (calendar.get(Calendar.MONTH) + 1));

//特别注意本周几的获取
System.out.println("周几: " + calendar.get(Calendar.DAY_OF_WEEK));

//计算时差,获取微妙后相减然后换算成时间
Calendar time1 = Calendar.getInstance();
time1.set(2017, 9, 10, 11, 22, 33);
Calendar time2 = Calendar.getInstance();
time2.set(2018, 4, 30, 21, 5, 53);

long val = time2.getTimeInMillis() - time1.getTimeInMillis();
long day = val / (1000 * 60 * 60 * 24);
System.out.println("相差: " + day + "天");

结果:

现在时间: 2017-07-06 12:05:09:0160
年: 2017
月: 7
本年第几天: 187
本月第几天: 6
1个小时以后: 1
3个月之前: 4

3.2.时间差

代码:

//计算时差,获取微妙后相减然后换算成时间
Calendar time1 = Calendar.getInstance();
time1.set(2017, 9, 10, 11, 22, 33);
Calendar time2 = Calendar.getInstance();
time2.set(2018, 4, 30, 21, 5, 53);

long val = time2.getTimeInMillis() - time1.getTimeInMillis();
long day = val / (1000 * 60 * 60 * 24);
System.out.println("相差: " + day + "天");

结果:

相差: 232天

3.3.要注意本周几的获取需要-1

System.out.println("周几: " + calendar.get(Calendar.DAY_OF_WEEK));

因为国外和中国的习惯不同,有的是以周一为第一天,有些地区是以周日为第一天,所以可能会在意Calendar里的方法setFirstDayOfWeek

代码:

System.out.println("周几: " + calendar.get(Calendar.DAY_OF_WEEK));
calendar.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println("周几: " + calendar.get(Calendar.DAY_OF_WEEK));

结果:

周几: 5
周几: 5

结果还是没有任何变化,查资料得知这个方法影响的不是本周第几天得到的周几,setFirstDayOfWeek的方法只对WEEK_OF_MONTHWEEK_OF_YEAR有作用,当需要这两个参数的时候还是需要根据当地的习惯设置setFirstDayOfWeek,或者直接用设置区域。

Locale.setDefault(Locale.CHINA);

calendar.get(Calendar.DAY_OF_WEEK)返回的其实就只是个常量,按照SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY的顺序,返回5表示的就是周四,所以可以通过代码转换一下。

代码:

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;  
if (dayOfWeek == 0)  
    dayOfWeek = 7;  

你可能感兴趣的:(Java)