java日期和时间Date、Calendar、SimpleDateFormat

时间:2022-11-08 15:36:44

1       时间和日期

1.1      日期类Date和格式化SimpleDateFormat

日期使用过程中需要将日期Date对象转化为字符串,或者将字符串形式的日期转化为日期Date对象。可以通过格式化类SimpleDateFormat来实现。

Date date = new Date(); //获取当前的系统时间。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss") ; //使用了默认的格式创建了一个日期格式化对象。

1.1.1   日期Date转字符串

String time = dateFormat.format(date); //可以把日期转换转指定格式的字符串

System.out.println("当前的系统时间:"+ time);

1.1.2   字符串转Date

String birthday = "2000年12月26日 11:29:08";

Date date2 = dateFormat.parse(birthday); //注意:指定的字符串格式必须要与SimpleDateFormat的模式要一致。

System.out.println(date2);

1.2      日历类Calendar

Calendar这个专门用于对日期进行操作的类,可以获取到日期中的年、月、日、时、分、秒,可以进行日期的加减运算。还可以和Date和String之间转换。

1.2.1   Calendar类解析

(1)Calendar的声明

public abstract class Calendar extends Objectimplements Serializable, Cloneable, Comparable<Calendar>

该类被abstract所修饰,说明不能通过new的方式来获得实例,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象(该对象为Calendar的子类对象),其日历字段已由当前日期和时间初始化:

Calendar rightNow = Calendar.getInstance();

(2)Calendar.getInstance函数实现

Calendar.getInstance函数内部会根据不同国家的本地时区和本地时间格式类型生成不同日历对象。例如西方国家1表示星期日,而中国1表示星期一。

public static Calendar getInstance()

{

Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));

cal.sharedZone = true;

return cal;

}

(3)createCalendar内部实现

private static Calendar createCalendar(TimeZone zone,

Locale aLocale)

{

Calendar cal = null;

String caltype = aLocale.getUnicodeLocaleType("ca");

if (caltype == null) {

// Calendar type is not specified.

// If the specified locale is a Thai locale,

// returns a BuddhistCalendar instance.

if ("th".equals(aLocale.getLanguage())

&& ("TH".equals(aLocale.getCountry()))) {

cal = new BuddhistCalendar(zone, aLocale);

} else {

cal = new GregorianCalendar(zone, aLocale);

}

} else if (caltype.equals("japanese")) {

cal = new JapaneseImperialCalendar(zone, aLocale);

} else if (caltype.equals("buddhist")) {

cal = new BuddhistCalendar(zone, aLocale);

} else {

// Unsupported calendar type.

// Use Gregorian calendar as a fallback.

cal = new GregorianCalendar(zone, aLocale);

}

return cal;

}

1.3      Calendar时间运算

1.3.1   获取时间值

创建一个日历对象,获取年、月、日、时、分、秒。

Calendar cal = Calendar.getInstance();

// 赋值时年月日时分秒常用的6个值,注意月份下标从0开始,所以取月份要+1

System.out.println("年:" + cal.get(Calendar.YEAR));

System.out.println("月:" + (cal.get(Calendar.MONTH) + 1));

System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));

System.out.println("时:" + cal.get(Calendar.HOUR_OF_DAY));

System.out.println("分:" + cal.get(Calendar.MINUTE));

System.out.println("秒:" + cal.get(Calendar.SECOND));

1.3.2   设置时间值

通过set函数设置时间的各个值。

cal.set(Calendar.YEAR,2000);//

cal.set(Calendar.MONTH) ,10); 设置值为10,表示11月

cal.set(Calendar.DAY_OF_MONTH));

cal.set(Calendar.HOUR_OF_DAY));

cal.set(Calendar.MINUTE));

cal.set(Calendar.SECOND));

1.3.3   加减运算

(1)在除夕晚上加上一秒,会自动进位

Calendar cal = Calendar.getInstance();

System.out.println(cal.getTime());

cal.set(2018, 1, 15, 23, 59, 59);

cal.add(Calendar.SECOND, 1);

System.out.println(cal.getTime());

输出结果为:

Thu Feb 15 23:59:59 CST 2018

Fri Feb 16 00:00:00 CST 2018

(2)1 月 31 号的时候,月份加一,会出现怎样结果

Calendar cal = Calendar.getInstance();

cal.set(2018, 1, 31, 8, 0, 0);

System.out.println(cal.getTime());

cal.add(Calendar.MONTH, 1);

System.out.println(cal.getTime());

运行结果:

Wed Jan 31 08:00:00 CST 2018

Wed Feb 28 08:00:00 CST 2018

说明 add 月份时,会将不存在的日期归为当月日历的最后一天。

所以说Calendar会根据日历中的时间规则自动进位和修改时间格式。

1.4      Calendar和Date、String之间的转换

(1)Calendar 转化 String

//获取当前时间的具体情况,如年,月,日,week,date,分,秒等

Calendar calendat = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

String dateStr = sdf.format(calendar.getTime());

(2)String 转化Calendar

String str="2010-5-27";

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

Date date =sdf.parse(str);

Calendar calendar = Calendar.getInstance();

calendar.setTime(date);

(3)Date 转化String

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

String dateStr=sdf.format(new Date());

(4)String 转化Date

String str="2010-5-27";

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

Date birthday = sdf.parse(str);

(5)Date 转化Calendar

Calendar calendar = Calendar.getInstance();

calendar.setTime(new java.util.Date());

(6)Calendar转化Date

Calendar calendar = Calendar.getInstance();

java.util.Date date =calendar.getTime();