1.jdk 1.8 之前的日期时间的API类型
①System类中currentTimeMillis();
②java.util.Date和子类java.sql.Date
③SimpleDateFormat
④Calendar
2.SimpleDateFormat的使用
SimpleDateFormat的使用,SimpleDateFormat对日期Date类的格式化和解析
1.格式化,日期 --->字符串
2.解析,格式化的逆过程,字符串 --->日期
@Test public void testSimpleDateFormat() throws ParseException { //实例化SimpleDateFormat SimpleDateFormat sdf=new SimpleDateFormat(); //格式化 日期 --->字符串 Date date=new Date(); System.out.println(date); //Thu Jul 18 21:41:57 CST 2019 String format = sdf.format(date); System.out.println(format); //19-7-18 下午9:41 //解析 String str="19-10-18 下午4:17"; Date date1=sdf.parse(str); System.out.println(date1); //Fri Oct 18 16:17:00 CST 2019 //*************按照指定的方式格式化和解析:调用带参的构造器******** //SimpleDateFormat sdf1=new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa"); SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String format1=sdf1.format(date); System.out.println(format1); //2019-07-18 09:41:57 //解析: 要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则会抛异常 Date date2 = sdf1.parse("2019-07-18 04:30:05"); System.out.println(date2);//Thu Jul 18 04:30:05 CST 2019 }
3.练习一:字符串"2019-07-18" 转换为java.sql.Date
@Test public void test1() throws ParseException { String birth="2019-07-18"; SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd"); Date date=sdf1.parse(birth); System.out.println(date); //Thu Jul 18 00:00:00 CST 2019 java.sql.Date birthDate = new java.sql.Date(date.getTime()); System.out.println(birthDate); //2019-07-18 }
4.练习二:渔夫“三天打渔两天晒网” 从1990-01-01开始,在之后的某年某月他是打渔还是晒网?例如2020-09-08
思路:转化为毫秒数,(一天=24小时=24 *60分钟=24 *60 *60秒=24 *60 *60 *1000毫秒)
具体代码实现:
@Test public void test2() throws ParseException { SimpleDateFormat sdf1 =new SimpleDateFormat("yyyy-MM-dd"); Date date1 =sdf1.parse("1990-01-01"); //System.out.println(date1.getTime()); //631123200000 SimpleDateFormat sdf2 =new SimpleDateFormat("yyyy-MM-dd"); Date date2 =sdf1.parse("2020-09-08"); //System.out.println(date2.getTime()); //1599494400000 //计算总天数 long date= (date2.getTime() - date1.getTime())/(1000 * 60 * 60 *24); //System.out.println(date); //11208 long l=date%5; //System.out.println(l); //3 if(l==1 || l==2 ||l==3){ System.out.println("渔夫打渔"); }else { System.out.println("渔夫晒网"); } }
5.Calendar日历类的使用
注意,获取月份时,一月是0,二月是1,以此类推,12月是11,获取星期时,周日是1,周一是2,以此类推,周六是7
@Test public void testCalendar(){ //1.实例化,它是抽象类,不能直接实例化 // 方式一,创建其子类(GregorianCalendar)的对象 //方式二,调用其静态方法getInstance() Calendar calendar=Calendar.getInstance(); System.out.println(calendar.getClass());//class java.util.GregorianCalendar相当于还是创建的子类的对象 //2.常用方法 //get() int day=calendar.get(Calendar.DAY_OF_MONTH);//获取今天是这个月的第几天 System.out.println(day); //18 System.out.println(calendar.get(Calendar.DAY_OF_WEEK)); //5 //set() calendar.set(Calendar.DAY_OF_MONTH,23); day=calendar.get(Calendar.DAY_OF_MONTH); System.out.println(day); //23 //add() calendar.add(Calendar.DAY_OF_MONTH,3);//修改的是calendar本身 day=calendar.get(Calendar.DAY_OF_MONTH); System.out.println(day); //26 calendar.add(Calendar.DAY_OF_MONTH,-3); day=calendar.get(Calendar.DAY_OF_MONTH); System.out.println(day); //23 //getTime() 日历类 ---> Date Date date=calendar.getTime(); System.out.println(date); //Tue Jul 23 21:50:21 CST 2019 //setTime() Date --->日历类 Date date1=new Date(); calendar.setTime(date1); day=calendar.get(Calendar.DAY_OF_MONTH); System.out.println(day); //18 }
6.jdk 1.8 新增的日期时间API
要增加新的日期时间API的原因:
①可变性,日期,时间这样的类应该是不可变的
②存在偏移性,Date中的年份是从1900开始的,月份是从0开始的
③格式化,格式化只对Date有用,Calendar则不行
④不是线程安全的,不能处理闰秒等
偏移量会导致错误的比较具体见下面代码实现:
@Test public void testDate(){ Date date1=new Date(2020,9,8); System.out.println(date1); //Fri Oct 08 00:00:00 CST 3920 Date date2=new Date(2020-1900,9,8); System.out.println(date2); //Thu Oct 08 00:00:00 CST 2020 }
jdk 1.8 新增的API ——LocalDate、LocalTime、LocalDateTime类等
LocalDate、LocalTime、LocalDateTime类的使用如下:
@Test public void test1(){ //now():获取当前的日期、时间、日期+时间 LocalDate localDate= LocalDate.now(); System.out.println(localDate); //2019-07-18 LocalTime localTime=LocalTime.now(); System.out.println(localTime); //20:34:18.986 LocalDateTime localDateTime=LocalDateTime.now(); System.out.println(localDateTime); //2019-07-18T20:34:18.986 //of():设置指定的年、月、日、时、分、秒,没有偏移量 LocalDateTime localDateTime1=LocalDateTime.of(2020,10,19,20,33,40); System.out.println(localDateTime1); //2020-10-19T20:33:40 //getxxx() 获取相关的属性 System.out.println(localDateTime.getDayOfMonth()); //18 当前是本月的第几天 System.out.println(localDateTime.getDayOfWeek()); //THURSDAY 当前是本周的周几 System.out.println(localDateTime.getMonth()); //JULY 当前是几月 System.out.println(localDateTime.getMonthValue()); //7 当前月份的数字形式 System.out.println(localDateTime.getHour()); //20 当前的小时数 System.out.println(localDateTime.getMinute()); //39 当前分钟数 System.out.println(localDateTime.getSecond()); //35 当前秒数 //体现了不可变性,返回值修改,本身并不修改 //withxxx():设置相关的属性 LocalDate localDate1 = localDate.withDayOfMonth(26); System.out.println(localDate); //2019-07-18 System.out.println(localDate1); // 2019-07-26 LocalDateTime localDateTime2= localDateTime.withHour(4); System.out.println(localDateTime); //2019-07-18T20:49:31.531 System.out.println(localDateTime2); //2019-07-18T04:49:31.531 //设置加 LocalDateTime localDateTime3 = localDateTime.plusMonths(3); System.out.println(localDateTime); //2019-07-18T20:53:55.526 System.out.println(localDateTime3); //2019-10-18T20:53:55.526 //设置减 LocalDateTime localDateTime4 = localDateTime.minusDays(5); System.out.println(localDateTime); //2019-07-18T20:56:12.180 System.out.println(localDateTime4); //2019-07-13T20:56:12.180 }
日期时间在使用时要格外注意。