目录
Calendar与Date都是表示日期的工具类,他们之间可以相互转换。
构造函数:
Date(int year,int month ,int day)已经过时
常用Date(long date):从标准时间起指定时间的毫秒数
标准时间:1970-1-1-8:00
常用方法:
Date类中日期和毫秒的相互转换:
1.日期获取毫秒值
Date date3 = new Date();
long time = date3.getTime();
2.把一个毫秒值转换为Date
- 构造方法
- setTime(long time)方法
使用DateFormat格式化日期
DateFormat是一个抽象类,它也提供了几个工厂方法用于获取DateFormat对象。返回的都是DateFormat对象的子类实例,是同一个类型的实例。
- getDateInstance():返回一个日期格式器,只对日期进行格式化。
- getTimeInstance():返回一个时间格式器,只对时间进行格式化。
- getDateTimeInstance():返回一个日期、时间格式器,既对时间又对日期进行格式化。
- getInstance():返回一个默认的系统相关的日期、时间格式器。
举例:
public static void main(String[] args) throws Exception{
DateFormat format = DateFormat.getInstance();
System.out.println(format.getClass());
format = DateFormat.getDateInstance();
System.out.println(format.getClass());
format = DateFormat.getTimeInstance();
System.out.println(format.getClass());
}
输出:
虽然返回的都是同一个对象类型的实例,但是根据不同的工厂方法,返回的对象在格式化时间对象时,处理不同部分的信息。
使用SimpleDateFormat格式化日期
SimpleDateFormat是DateFormat的子类,是一种更简单的日期格式,以我们指定的格式对日期进行格式化。
举例:
public static void main(String[] args) throws Exception{
Date date = new Date();
SimpleDateFormat simple = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(simple.format(date));
simple = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(simple.format(date));
}
输出:
日期与日期格式字符串的相互转化:
字符串转换成日期:parse()
日期转字符串:format()
public static void main(String[] args) throws Exception{
// Date -- String
// 创建日期对象
Date d = new Date();
// 给定模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = sdf.format(d);
System.out.println(s);
//String -- Date
String str = "2008-12-13 12:12:12";
//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(str);
System.out.println(dd);
}
注意:yyyy 、MM、dd、HH、mm、ss 均严格区分大小写。否则会带来不可预知的问题。
具体用法如下:
字母 | 含义 | 示例 |
y | Year | 1996;96 哪一年 |
M | Month in year | 07 一年中的哪一月 |
m | Minute in hour | 30 一个小时中的第几分钟 |
w | Week in year | 27 一年中的第几个星期 |
W | Week in month | 2 一个月中的第几个星期 |
D | Day in year | 189 一年中的第几天 |
d | Day in month | 10 一个月中的第几天 |
H | Hour in day (0-23) | 0 一天中的第几个小时(24小时制) |
h | Hour in am/pm (1-12) | 12 一天中上午、下午的第几个小时(12小时制) |
S | Millisecond | 978 毫秒数 |
s | Second in minute | 55 一分钟的第几秒 |
Calendar类
Date类的问题:
- 无法实现国际化。
- 不同属性使用了前后矛盾的偏移量,比如月份和小时都是从0开始,月份中的天数则是从1开始的,年又是从1900开始。
Calendar是一个抽象类,用于表示日历。因为Date类在设计上存在一些缺陷,所以Java提供Calendar类来更好的处理日期和时间。
Calendar类不能直接创建,可以通过类方法来创建一个Calendar的子类,Java本身提供了GregorianCalendar子类,通过getInstance()方法返回默认时区和语言环境获得一个日历。返回的实例就是Java提供的默认子类
public static void main(String[] args) throws Exception{
Calendar cal = Calendar.getInstance();
System.out.println(cal.getClass()); //class java.util.GregorianCalendar
}
Calendar与Date都是表示日期的工具类,他们之间可以相互转换。
举例:
public static void main(String[] args) throws Exception{
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
System.out.println(date);
Calendar cale = Calendar.getInstance();
cale.setTime(date);
}
Calendar类提供的常用方法:
- void add(int field,int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
- int get(int field):返回指定日历字段的值。
- int getActualMaximum(int field):返回指定日历字段的可能拥有的最大值。
- int getActualMinimum(int field):返回指定日历字段的可能拥有的最小值。
- void roll(int field,int amout):与add方法相似,区别在于超过该字段的最大范围时,也不会向上一个字段进位。
- void set(int field,int value):将给定的日历字段设置为给定值。
- void set(int year,int month,int date):设置Calendar对象的年、月、日3个字段值。
- void set(int year,int month,int date,int hourOfDay,int minute,int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值。
public static void main(String[] args) throws Exception { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("=================================="); System.out.println(sdf.format(cal.getTime())); System.out.println(cal.get(Calendar.YEAR)); cal.add(Calendar.MONTH, 12); System.out.println(cal.get(Calendar.YEAR)); System.out.println("========================="); cal = Calendar.getInstance(); System.out.println(cal.get(Calendar.YEAR)); cal.roll(Calendar.MONTH, 12); System.out.println(cal.get(Calendar.YEAR)); System.out.println("=================================="); System.out.println(cal.getActualMaximum(Calendar.MONTH)); // 11 System.out.println(cal.getActualMinimum(Calendar.MONTH)); // 0 System.out.println("=================================="); System.out.println(cal.get(Calendar.MONTH)); System.out.println(cal.get(Calendar.DAY_OF_MONTH)); System.out.println(cal.get(Calendar.DAY_OF_WEEK)); System.out.println(cal.get(Calendar.WEEK_OF_MONTH)); System.out.println(cal.get(Calendar.WEEK_OF_YEAR)); System.out.println("=================================="); cal.set(2018, 0, 1, 1, 1); System.out.println(sdf.format(cal.getTime())); /* * JANUARY = 0, FEBRUARY = 1, MARCH = 2, APRIL = 3, MAY = 4, JUNE = 5, * JULY = 6, AUGUST = 7, SEPTEMBER = 8, OCTOBER = 9, NOVEMBER = 10, * DECEMBER = 11, UNDECIMBER = 12 */ System.out.println(cal.get(Calendar.MONTH)); /* 从1开始 */ System.out.println(cal.get(Calendar.DAY_OF_MONTH)); /* * SUNDAY = 1; 星期天 MONDAY = 2; 星期一 TUESDAY = 3; WEDNESDAY = 4; THURSDAY * = 5; FRIDAY = 6; SATURDAY = 7; JANUARY = 0; 星期六 */ System.out.println(cal.get(Calendar.DAY_OF_WEEK)); /* 从1开始 */ System.out.println(cal.get(Calendar.WEEK_OF_MONTH)); /* 从1开始 */ System.out.println(cal.get(Calendar.WEEK_OF_YEAR)); }