018---日期类--利用案例轻松学习Java语言课件
- 格式:ppt
- 大小:3.74 MB
- 文档页数:19


java之Date(⽇期)、Date格式化、Calendar(⽇历)参考Date(⽇期)Date类注意:是java.util.Date;⽽⾮ java.sql.Date,此类是给数据库访问的时候使⽤的时间原点概念所有的数据类型,⽆论是整数,布尔,浮点数还是字符串,最后都需要以数字的形式表现出来。
⽇期类型也不例外,换句话说,⼀个⽇期,⽐如2020年10⽉1⽇,在计算机⾥,会⽤⼀个数字来代替。
那么最特殊的⼀个数字,就是零. 零这个数字,就代表Java中的时间原点,其对应的⽇期是1970年1⽉1⽇ 8点0分0秒。
(为什么是8点,因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个⼩时)为什么对应1970年呢?因为1969年发布了第⼀个 UNIX 版本:AT&T,综合考虑,当时就把1970年当做了时间原点。
所有的⽇期,都是以为这个0点为基准,每过⼀毫秒,就+1。
创建⽇期对象package date;//import java.util.Date;public class TestDate {public static void main(String[] args) {// 当前时间Date d1 = new Date();System.out.println("当前时间:");System.out.println(d1);System.out.println();// 从1970年1⽉1⽇早上8点0分0秒开始经历的毫秒数Date d2 = new Date(5000);System.out.println("从1970年1⽉1⽇早上8点0分0秒开始经历了5秒的时间");System.out.println(d2);}}getTimegetTime() 得到⼀个long型的整数这个整数代表从1970.1.1 08:00:00:000 开始每经历⼀毫秒,增加1package date;//import java.util.Date;//注意:是java.util.Date;//⽽⾮ java.sql.Date,此类是给数据库访问的时候使⽤的Date now= new Date();//打印当前时间System.out.println("当前时间:"+now.toString());//getTime() 得到⼀个long型的整数//这个整数代表 1970.1.1 08:00:00:000,每经历⼀毫秒,增加1System.out.println("当前时间getTime()返回的值是:"+now.getTime());Date zero = new Date(0);System.out.println("⽤0作为构造⽅法,得到的⽇期是:"+zero);}}System.currentTimeMillis()当前⽇期的毫秒数new Date().getTime() 和 System.currentTimeMillis() 是⼀样的不过由于机器性能的原因,可能会相差⼏⼗毫秒,毕竟每执⾏⼀⾏代码,都是需要时间的package date;//import java.util.Date;public class TestDate {public static void main(String[] args) {Date now= new Date();//当前⽇期的毫秒数System.out.println("Date.getTime() \t\t\t返回值: "+now.getTime());//通过System.currentTimeMillis()获取当前⽇期的毫秒数System.out.println("System.currentTimeMillis() \t返回值: "+System.currentTimeMillis());}}练习-⽇期借助,创建⼀个从1995.1.1 00:00:00 到 1995.12.31 23:59:59 之间的随机⽇期package date;import java.util.Date;import java.text.ParseException;import java.text.SimpleDateFormat;public class Test2 {public static void main(String[] args) throws ParseException {String startStr = "1995.1.1 00:00:00";String endStr = "1995.12.31 23:59:59";SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");Date start = sdf.parse(startStr);Date end = sdf.parse(endStr);long random = (long)(Math.random() * (end.getTime() - start.getTime()) + start.getTime());System.out.println(new Date(random));}}Date格式化⽇期转字符串SimpleDateFormat ⽇期格式化类package date;//import java.text.SimpleDateFormat;import java.util.Date;//y 代表年//M 代表⽉//d 代表⽇//H 代表24进制的⼩时//h 代表12进制的⼩时//m 代表分钟//s 代表秒//S 代表毫秒SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS" );Date d= new Date();String str = sdf.format(d);System.out.println("当前时间通过 yyyy-MM-dd HH:mm:ss SSS 格式化后的输出: "+str);SimpleDateFormat sdf1 =new SimpleDateFormat("yyyy-MM-dd" );Date d1= new Date();String str1 = sdf1.format(d1);System.out.println("当前时间通过 yyyy-MM-dd 格式化后的输出: "+str1);}}字符串转⽇期模式(yyyy/MM/dd HH:mm:ss)需要和字符串格式保持⼀致,如果不⼀样就会抛出解析异常ParseException package date;//import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class TestDate {public static void main(String[] args) {SimpleDateFormat sdf =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss" );String str = "2016/1/5 12:12:12";try {Date d = sdf.parse(str);System.out.printf("字符串 %s 通过格式 yyyy/MM/dd HH:mm:ss %n转换为⽇期对象: %s",str,d.toString());} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}练习-⽇期格式化准备⼀个长度是9的⽇期数组使⽤1970年-2000年之间的随机⽇期初始化该数组按照这些⽇期的时间进⾏升序排序⽐如 1988-1-21 12:33:22 就会排在 1978-4-21 19:07:23 前⾯,因为它的时间更⼩,虽然⽇期更⼤public static void test2() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy");Date startDate = sdf.parse("1970");Date endDate = sdf.parse("2000");long difference = endDate.getTime() - startDate.getTime();Date[] dateArr = new Date[9];System.out.println("排序前随机时间数组为:");//3⾏3列打印该随机时间数组for (int i = 0; i < dateArr.length; i++) {Date date = new Date((long) (Math.random() * difference + startDate.getTime()));dateArr[i] = date;//System.out.print(sdf.format(date)+" ");System.out.printf(date + "");if ((i + 1) % 3 == 0) {System.out.println();}}SimpleDateFormat sdf2 = new SimpleDateFormat("HHmmss");for (int i = 0; i < dateArr.length - 1; i++) {for (int j = i + 1; j < dateArr.length; j++) {String str1 = sdf2.format(dateArr[i]);int num1 = Integer.parseInt(str1);String str2 = sdf2.format(dateArr[j]);int num2 = Integer.parseInt(str2);if (num1 > num2) {Date temp = dateArr[i];dateArr[i] = dateArr[j];dateArr[j] = temp;}}}System.out.println("排序后随机时间数组为:");//3⾏3列打印该随机时间数组for (int i = 0; i < dateArr.length; i++) {//System.out.print(sdf.format(dateArr[i]));System.out.printf(dateArr[i] + "");if ((i + 1) % 3 == 0) {System.out.println();}}}Calendar(⽇历)Calendar类即⽇历类,常⽤于进⾏“翻⽇历”,⽐如下个⽉的今天是多久Calendar与Date进⾏转换package date;//import java.util.Calendar;import java.util.Date;public class TestDate {public static void main(String[] args) {//采⽤单例模式获取⽇历对象Calendar.getInstance();Calendar c = Calendar.getInstance();//通过⽇历对象得到⽇期对象Date d = c.getTime();Date d2 = new Date(0);c.setTime(d2); //把这个⽇历,调成⽇期 : 1970.1.1 08:00:00}}翻⽇历add⽅法,在原⽇期上增加年/⽉/⽇set⽅法,直接设置年/⽉/⽇package date;import java.text.SimpleDateFormat;//import java.util.Calendar;import java.util.Date;public class TestDate {private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) {Calendar c = Calendar.getInstance();Date now = c.getTime();// 当前⽇期System.out.println("当前⽇期:\t" + format(c.getTime()));// 下个⽉的今天c.setTime(now);c.add(Calendar.MONTH, 1);System.out.println("下个⽉的今天:\t" +format(c.getTime()));// 去年的今天c.setTime(now);c.add(Calendar.YEAR, -1);System.out.println("去年的今天:\t" +format(c.getTime()));// 上个⽉的第三天c.setTime(now);c.add(Calendar.MONTH, -1);c.set(Calendar.DATE, 3);System.out.println("上个⽉的第三天:\t" +format(c.getTime()));}private static String format(Date time) {return sdf.format(time);}}练习-Calendar找出下个⽉的倒数第3天是哪天//找出下个⽉的倒数第3天是哪天public static void test4() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calendar.getInstance();//⽇历类采⽤了单例模式c.add(Calendar.MONTH, 1);int month = c.get(Calendar.MONTH);while (c.get(Calendar.MONTH) == month) {c.add(Calendar.DATE, 1);System.out.println("c.add(DATE,1)结果:" + sdf.format(c.getTime()));}c.add(Calendar.DATE, -3);System.out.println("下个⽉的倒数第三天:" + sdf.format(c.getTime()));}。