日期、时间类
Date类
java8中的构造器,之前有六个但是其余四个已经不推荐使用了。
构造器 | 功能 |
---|---|
Date() |
生成一个代表当前日期时间的Date对象 |
Date(long date) |
根据指定的long整形数来生成一个Date对象,该构造器的参数表示与计算机元年之间的时间差,以毫秒计 |
大部分方法也不被推荐,只剩下几个方法:
方法 | 描述 |
---|---|
boolean after(Date when) |
测试该日期是否在指定日期when之后 |
boolean before(Date when) |
测试该日期是否在指定日期when之前 |
long getTime() |
返回该时间对应的long型整数,从计算机元年到Date对象之间的时间差,以毫秒计 |
void setTime(long time) |
设置该对象的时间 |
public static void main(String[] args) {
Date d1 = new Date();
//获取当前系统的毫秒值
System.out.println(d1.getTime());//1540796552553
//设置系统时间
d1.setTime(58298265);
System.out.println(d1);//Fri Jan 02 00:11:38 CST 1970
//获取当前时间之后100ms的时间
Date d2 = new Date(System.currentTimeMillis() + 100);
System.out.println(d2);//Mon Oct 29 14:57:23 CST 2018
System.out.println(d1.compareTo(d2));//-1
System.out.println(d1.before(d2));//true
}
日期与毫秒的转换
public static void main(String[] args) {
//Date---- long 的转换
long time = new Date().getTime();//1540796704636
System.out.println(time);
//long----date
Date date = new Date(1540796686252L);//Mon Oct 29 15:04:46 CST 2018
System.out.println(date);
}
Calendar日历类
什么是Calender类?
弥补了Date类的缺陷的一个表示日历的抽象类。不能直接实例化,程序只能创建calender子类的实例。
与Date类的相互转换
public static void main(String[] args) {
//创建一个默认的Calendar对象
Calendar cl = Calendar.getInstance();
//从Calender对象中取出Date对象
Date date = cl.getTime();
//通过Date对象获取Calendar对象
Calendar cl2 = Calendar.getInstance();
cl2.setTime(date);
}
Calender类提供了大量访问、修改日期的方法,常用方法:
//创建一个默认的Calendar对象
Calendar cl = Calendar.getInstance();
System.out.println(cl);
//对象返回这些信息可通过指定字段调用
/*java.util.GregorianCalendar[time=1540797473633,areFieldsSet=true,
areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],
firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=44,
WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=302,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=5,
AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=17,SECOND=53,MILLISECOND=633,ZONE_OFFSET=28800000,DST_OFFSET=0]
*/
- void add(int field,int amount):为给定日历字段添加或减去指定的时间量;
//获取指定字段的值
System.out.println(cl.get(Calendar.YEAR));//2018
System.out.println(cl.get(Calendar.MONTH));//9
System.out.println(cl.get(Calendar.WEEK_OF_YEAR));//一年中的第几周 44
System.out.println(cl.get(Calendar.DAY_OF_MONTH));//一个月的第几天 29
System.out.println(cl.get(Calendar.DAY_OF_WEEK));//一周的第几天 2
System.out.println(cl.get(Calendar.DAY_OF_WEEK_IN_MONTH));//这个月的第几周 5
- int get(int field):返回指定日历字段的值;
//给指定字段的值添加
cl.add(Calendar.YEAR,3);
System.out.println(cl.getTime());//Fri Oct 29 15:23:25 CST 2021
- int getActualMaximum(int field):返回指定日历字段可能拥有的最大值。
//从0开始计
System.out.println(cl.getActualMaximum(Calendar.YEAR));
System.out.println(cl.getActualMaximum(Calendar.MONTH));//11个月
System.out.println(cl.getActualMaximum(Calendar.HOUR));//11小时
System.out.println(cl.getActualMaximum(Calendar.MINUTE));//59分钟
- int getActualMininum(int field):返回指定日历字段可能拥有的最小值;
- void roll(int field,int amount):与add方法类似,区别在于加上amount后超过了该字段所能表示范围时不会向上一个字段进位。
- void set(int field,int value):将给定日历字段设置为给定值;
- void set(int year,int month,int date):设置Calendar对象的年、月、日三个字段的值;
- void set(int year,int month,int date,int hourOfDay,int minute,int second):设置Calendar对象的年、月、日、时、分、秒六个字段的值;
add和roll的区别
Calendar cal3 = Calendar.getInstance();
cal3.set(2003,7,23,0,0,0);
//不想上进位,年份不变1
cal3.roll(Calendar.MONTH,6);//Sun Feb 23 00:00:00 CST 2003
System.out.println(cal3.getTime());
Calendar cal4 = Calendar.getInstance();
cal4.set(2003,7,31,0,0,0);
//MONTH字段进位后变成2,2月没有31
cal4.add(Calendar.MONTH,-6);
System.out.println(cal4.getTime());//Fri Feb 28 00:00:00 CST 2003
set的容错性
Calendar提供了一个setLenient()用于设置它的容错性,
比如设置月份为13。
Calendar cal= Calendar.getInstance();
cal.set(Calendar.MONTH,13);
System.out.println(cal.getTime());//Fri Mar 01 15:50:07 CST 2019
//关闭容错性,默认是开启的
cal.setLenient(false);
cal.set(Calendar.MONTH,13);
System.out.println(cal.getTime());
//Exception in thread "main" java.lang.IllegalArgumentException: MONTH
可以看到第一段代码运行正常,关闭容错性后,将不能设置不合法的字段值,否则会抛出异常。
set方法延迟修改
set(f,value)方法将日历字段f更改为value,此外他还设置了一个内部成员变量,以指示日历字段f已经被更改。尽管日历字段是更改的,但该Calendar所代表的时间且不会立即更改,直到下次调用get()、getTime、getTimeInMillis、add或roll时才会重新计算日历时间,被称为set方法的延迟修改,这种机制的优势是如果多次修改,不会出发所赐不必要的计算。
日期格式化类SimpleDateFormat
SimpleDateFormat format = new SimpleDateFormat();
//把当前日期格式化成一个日期字符串
String date=format.format(new Date());
System.out.println(date);//默认格式18-11-1 下午6:58
还可以自定义输出的时间格式
- y:年
- M:月
- d:天
- H:时
- m:分
- s:秒
- E:星期
//自定义格式
SimpleDateFormat simp= new SimpleDateFormat("yyyy年MM月dd号 HH点mm分ss秒 E z");
String format1=simp.format(new Date());//2018年11月01号 19点05分18秒 星期四 CST
System.out.println(format1);
将字符串解析成日期对象
注意格式对应
String dateStr="2018-10-10 10:30:30";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=simpleDateFormat.parse(dateStr);//可能会产生异常 ParseException 异常抛出
System.out.println(date);//Wed Oct 10 10:30:30 CST 2018
Java8新增的日期、时间包
Clock:该类用于获取指定时区的当前日期、时间。
//获取当前Clock
Clock clock=Clock.systemUTC();
//获取当前时刻
System.out.println(clock.instant());
//2018-11-01T12:07:16.234Z
//获取对应毫秒数
System.out.println(clock.millis());
//1541074036373
Duration:代表持续时间,该类可以方便地获取一段时间;
Duration d=Duration.ofSeconds(6000);
System.out.println("6000秒相当于"+d.toMinutes()+"分");
System.out.println("6000秒相当于"+d.toHours()+"小时");
System.out.println("6000秒相当于"+d.toDays()+"天");
System.out.println("6000秒相当于"+d.toMillis()+"毫秒");
System.out.println("6000秒相当于"+d.toNanos()+"纳秒");
Instant:代表一个具体的时刻,可以精确到纳秒;
//获取当前时间
Instant instant=Instant.now();
System.out.println(instant);
//instant添加6000秒,返回新的Instant
Instant instant2=instant.plusSeconds(6000);
System.out.println(instant2);
//根据字符串解析Instant对象
Instant instant3=Instant.parse("2018-11-01T14:10:56.812Z");
System.out.println(instant3);
//在instant3上添加5小时4分钟
Instant instant4=instant3.plus(Duration.ofHours(5).plusMinutes(4));
System.out.println(instant4);
//获取Instant4五天之前的时间
Instant instant5=instant4.minus(Duration.ofDays(5));
System.out.println(instant5);
LocalDate:该类代表不带时区的日期;
LocalDate localDate=LocalDate.now();
System.out.println(localDate);//2018-11-01
//获取2018年的第188天
localDate=LocalDate.ofYearDay(2018,188);
System.out.println(localDate);//2018-07-07
//设置为2018年5月21日
localDate=LocalDate.of(2018,5,21);
System.out.println(localDate);
LocalTime:代表不带时区的时间;
同上
LocalDateTime:代表不带时区的日期和时间;
同上
MonthDay:仅代表月日;
Year:该类仅代表年;
YearMonth:代表年月;
ZoneDateTime:代表一个时区化日期、时间;
Zoneld:代表一个时区;
DayOfWeek:这是一个枚举类,定义了周日到周六的枚举值;
Month:定义了一月到十二月的枚举值;
//获取当年分
Year year=Year.now();
//再加5年
year=year.plusYears(5);
//根据指定月份获取YearMonth
YearMonth ym=year.atMonth(10);
MonthDay md=MonthDay.now();
//设置5月23日
MonthDay md2=md.with(Month.MAY).withDayOfMonth(23);