java中的时间和日期类

日期、时间类

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);

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/83625062
今日推荐