有空整理一下之前的东西,因为最近用到了calendar这个类,故做了一些整理.
1.时区和地区的差异
目前比较常用的是GMT和UTC,GMT官方叫做格林尼治时间,也是目前格林尼治天文台的官方时间,世界都比较认可的,UMT也叫世界协调时,是在 GMT基础上作了一些修改,前后差异不大。
地区的差异主要反映在中国普遍以礼拜一作为一个礼拜的开始,西方是以礼拜天作为一个礼拜的开始(这也解释了为什么Calendar.DAY_OF_WEEK返回的时间总是跟我们想要的差了那么一点,比如返回1,其实是礼拜天,而不是我们想象的礼拜一
2.Calendar对象的获取
方法一: Calendar cal=Calendar.getInstance() 该方法常用,直接获取了calendar的一个实例,返回的是当前的时间.
java8中的源码这么记录:
/**
* Gets a calendar using the default time zone and locale. The
* <code>Calendar</code> returned is based on the current time
* in the default time zone with the default locale.
*
* @return a Calendar.
*/
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
cal.sharedZone = true;
return cal;
}
调取的就是这个静态方法,返回的是一个Calendar对象.
方法二: Calendar cal= new GregorianCalendar();该方法相对用的少
摘自源码中的代码:
*
* @see TimeZone
* @author David Goldsmith, Mark Davis, Chen-Lieh Huang, Alan Liu
* @since JDK1.1
*/
public class GregorianCalendar extends Calendar {
/*
* Implementation Notes
*
很明显,GregorianCalendar是Calendar的一个子类
3.通过Calendar设置时间
方法: void set(int field,int value);
public static String getTimeByCalendar(){
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR,2005);
cal.set(Calendar.MONTH,7);
cal.set(Calendar.DAY_OF_MONTH,12);
cal.set(Calendar.HOUR_OF_DAY,15);
cal.set(Calendar.MINUTE,23);
cal.set(Calendar.SECOND,45);
Date date=cal.getTime();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=format.format(date);
return time;
}
这里需要解释一下: DAY_OF_MONTH:月中的天,也就是几号;
DAY_OF_WEEK:星期中的天,相当于礼拜几;
DAY_OF_YREA:一年中的第几天
HOUR_OF_DAY:此处需要注意的是get获取的是24小时制的时间值
此处的MONTH需要注意的是从0开始,我这边写的是7,其实是八月份。
其他的类推。
4.通过Calendar获取时间
方法: int get(int field):该方法可以获取Calendar中给定的时间分量对应的值
Calendar cal=Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
System.out.println(cal.get(Calendar.HOUR_OF_DAY));
5通过Calendar修改时间值(往前或者往后推算)
方法: void add(int field,int value):当前的calendar加上给定的时间分量对应的值
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH,5);
calendar.set(Calendar.MONTH,0);
此处需要注意的是,value的值正负决定是往前还是往后,这个自己可以测试一下
此处还有另外一方法: void roll(int field,int value):主要功能和add差不多,但是两者的差别还是有的:
代码如下:
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
calendar.set(Calendar.MONTH,0);
calendar.roll(Calendar.MONTH,-1);
System.out.println(convertDateToString(calendar.getTime()));
}
public static String convertDateToString(Date date){
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=format.format(date);
return time;
}
输出的是:2017-12-27 01:42:36,是不是有点不对,我想要的时间应该是2016-12-27 01:42:36,
可见roll它只会变更当前位置的时间值,不会借位进行对应的加减
我们换成add试试看:
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
calendar.set(Calendar.MONTH,0);
calendar.add(Calendar.MONTH,-1);
System.out.println(convertDateToString(calendar.getTime()));
}
public static String convertDateToString(Date date){
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=format.format(date);
return time;
}
ok,这个才是对的。
6.Calendar与Date之间的转换:
Calendar转换成Date
Calendar calendar=Calendar.getInstance();
Date date=calendar.getTime()
Date 转换成 Calendar
Calendar calendar=Calendar.getInstance();
Date date=new Date();
calendar.setTime(date);
ok!!!! 暂时总结到此吧!!! 温故而知新,可以为师矣!