一,JDK7时间:
1.Date:
我先通过一段代码简单展示一下它的几个方法及功能
代码:
这里要注意的是
时间原点:1970年1月1日 00:00:00
中国的时间原点:由于中国处在东八区,时间原点要晚上8小时,即为1970年1月1日08:00:00
下方代码第二点,创建一个对象表示一个指定的时间中:
1.括号中的参数为long类型单位为毫秒,所以在0后面加了一个大写的L,提高代码可读性
2.填写的参数为0,即表示把从时间原点开始过0毫秒后的时间赋值给这个对象中
下方代码第三点,setTime修改时间中:
1.括号中的参数类型也为long,且单位为毫秒,所以数字后面使用L修饰
2.填写1000表示把从时间原点开始过1000毫秒后的时间赋值给这个对象
public class Demo1 {public static void main(String[] args) {//1.创建对象表示一个时间(当前时间)Date d1 = new Date();System.out.println(d1);//2.创建对象表示一个指定的时间Date d2 = new Date(0L);System.out.println(d2);//3.setTime修改时间d2.setTime(1000L);System.out.println(d2);//4.getTime获取当前时间距离时间原点的毫秒值long time = d2.getTime();System.out.println(time);}
}
运行结果:
小练习:
题目:需求1:打印时间原点开始一年之后的时间
需求2:定义两个Date对象,比较一下哪个在前哪个在后
代码:
public class Test1 {public static void main(String[] args) {//需求1:打印时间原点开始一年之后的时间//创建对象表示时间原点Date d1 = new Date(0L);//获取时间原点毫秒值long time = d1.getTime();//在这个毫秒值基础上加一年(单位毫秒)time = time + 1000L * 60 * 60 * 24 * 365;//注:不加L会导致运算出错,因为后面这些数字会超出int的范围//将这个毫秒值返回最初的时间原点对象d1.setTime(time);System.out.println("需求1结果:");System.out.println(d1);//需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后Random r = new Random();//创建两个Date对象,通过循环随机获取时间原点后任意毫秒的时间,并使用Math.abs()来取绝对值保证为正数Date d2 = new Date(Math.abs(r.nextLong()));Date d3 = new Date(Math.abs(r.nextLong()));//获取两个对象距离时间原点的毫秒值long time1 = d2.getTime();long time2 = d3.getTime();//比较并输出结果System.out.println("需求2结果:");System.out.println("第一个时间为:" + d2);System.out.println("第二个时间为:" + d3);if(time1 > time2) {System.out.println("第一个时间在后面,第二个时间在前面");} else if (time1 < time2) {System.out.println("第一个时间在前面,第二个时间在后面");} else {System.out.println("两个时间一样");}}
}
运行结果:
2.SimpleDateFormat方法:
构造方法与成员方法(格式化与解析):
格式化为将日记对象转换成字符串,解析为将字符串转换成日记对象
代码:
public class Demo2 {public static void main(String[] args) throws ParseException {//格式化System.out.println("------------------格式化------------------");//1.利用空参构造创建SimpleDateFormat对象,默认格式SimpleDateFormat sdf1 = new SimpleDateFormat();Date d1 = new Date(0L);String format1 = sdf1.format(d1);System.out.println(format1);System.out.println("-----------------");//2.利用带参构造创建SimpleDateFormat对象,指定格式SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String format2 = sdf2.format(d1);System.out.println(format2);//解析System.out.println("------------------解析------------------");//定义一个字符串表示时间String str = "2000-01-01 01:01:01";SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = sdf3.parse(str);System.out.println(date);//转换之后就可以再使用Date的方法获取距离时间原点的时间了long time = date.getTime();System.out.println(time);}
}
代码中y M d H m s,分别表示年 月 日 小时 分钟 秒,一个字母代表一位,它们是方法中定义好的
方法中定义了以下模式字母:
运行结果:
练习一:
假设,出生年月日为:2003-09-01
请用字符串表示这个数据,并将其转换为:2003年9月1日
代码:
public class Test2 {public static void main(String[] args) throws ParseException {String birth = "2003-09-01";SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");Date d1= sdf1.parse(birth);SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");String result = sdf2.format(d1);System.out.println(result);}
}
运行结果:
练习二:
有一个秒杀活动,开始时间为:2024年11月11日 0:0:0
结束时间为:2024年11月11日 0:10:0
person1下单时间为:2024年11月11日 0:01:00
person2下单时间为:2024年11月11日 0:11:00
用代码说明ta们有没有参加成功:
代码:
public class Test3 {public static void main(String[] args) throws ParseException {//定义字符串存储开始结束时间和小黑小白的下单时间String startStr = "2024年11月11日 0:0:0";String endStr = "2024年11月11日 0:10:0";String person1OrderStr = "2024年11月11日 0:01:0";String person2OrderStr = "2024年11月11日 0:11:0";//创建SimpleDateFormatSimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//将字符串解析成Date类Date startDate = sdf.parse(startStr);Date endDate = sdf.parse(endStr);Date person1OrderDate = sdf.parse(person1OrderStr);Date person2OrderDate = sdf.parse(person2OrderStr);//利用Date类方法求出距离时间原点的毫秒值Long startTime = startDate.getTime();Long endTime = endDate.getTime();Long person1OrderTime = person1OrderDate.getTime();Long person2OrderTime = person2OrderDate.getTime();//进行比较if(person1OrderTime >= startTime && person1OrderTime <= endTime) {System.out.println("person1秒杀成功");} else {System.out.println("person1秒杀失败");}if(person2OrderTime >= startTime && person2OrderTime <= endTime) {System.out.println("person2秒杀成功");} else {System.out.println("person2秒杀失败");}}
}
运行结果:
3.Calendar:
这个类表示一个时间的日历对象
常用方法:
public static Calendar getInstance() 获取当前时间的日历对象public final Date getTime() 获取日期对象 public final setTime(Date date) 给日历设置日期对象public long getTimeInMillis() 拿到时间毫秒值 public void setTimeInMillis(long millis) 给日历设置时间毫秒值public int get(int field) 取日期中的某个字段信息 public void set(int field,int value) 修改日历的某个字段信息 public void add(int field,int amount) 为某个字段增加/减少指定的值
代码演示:
public class Test4 {public static void main(String[] args) throws ParseException {/*public static Calendar getInstance() 获取当前时间的日历对象public final Date getTime() 获取日期对象public final setTime(Date date) 给日历设置日期对象public long getTimeInMillis() 拿到时间毫秒值public void setTimeInMillis(long millis) 给日历设置时间毫秒值public int get(int field) 取日期中的某个字段信息public void set(int field,int value) 修改日历的某个字段信息public void add(int field,int amount) 为某个字段增加/减少指定的值*///创建日历对象Calendar c = Calendar.getInstance();System.out.println(c);//获取日期对象Date d1 = c.getTime();//给日历设置日期对象String timeStr = "2024-4-6";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date d2 = sdf.parse(timeStr);c.setTime(d2);System.out.println(c);//拿到时间毫秒值long timeInMillis1 = c.getTimeInMillis();System.out.println(timeInMillis1);//给日历设置时间毫秒值c.setTimeInMillis(10000);timeInMillis1 = c.getTimeInMillis();System.out.println(timeInMillis1);//取日期中的某个字段信息//给日历对象c存储上日期2024-4-6c.setTime(d2);System.out.println(c);int year = c.get(Calendar.YEAR);//注意:月份字段范围为0~11,实际上的月份为当前的值+1,比如0表示1月,3表示4月,所以月份+1int month = c.get(Calendar.MONTH) + 1;int date = c.get(Calendar.DAY_OF_MONTH);//注意:外国认为星期日是第一天,星期一是第二天,星期二第三天,以此类推,所以创建一个方法来让输出结果符合中国人的阅读习惯int week = c.get(Calendar.DAY_OF_WEEK);System.out.println(year + ", " + month + ", " + date + ", " + getWeek(week));}public static String getWeek(int index) {String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};return arr[index];}
}
运行结果:
这是日历中年月日所在字段
二,JDK8时间:
1.Date类方法:
(1)zoneId时区:
代码演示:
public class Demo1 {public static void main(String[] args) {//获取所有的时区名称 一共有600个Set<String> zoneIds = ZoneId.getAvailableZoneIds();System.out.println(zoneIds);//获取当前系统的默认时区ZoneId zoneId = ZoneId.systemDefault();System.out.println(zoneId);//获取指定的时区ZoneId zoneId1 = ZoneId.of("Asia/Taipei");System.out.println(zoneId1);}
}
运行结果:
(2)Instant时间戳:
代码演示:
public class Demo2 {public static void main(String[] args) {//1.获取当前时间的Instant对象(标准时间)System.out.println("----------1----------");Instant now = Instant.now();System.out.println(now);//2.根据(秒/毫秒/纳秒)获取Instant对象System.out.println("----------2----------");Instant instant1 = Instant.ofEpochMilli(1000L);//单位为毫秒System.out.println(instant1);Instant instant2 = Instant.ofEpochSecond(1L);//单位为秒System.out.println(instant2);Instant instant3 = Instant.ofEpochSecond(0L,1000000000);//参数为秒和纳秒System.out.println(instant3);//3.指定时区System.out.println("----------3----------");ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("Asia/Shanghai"));System.out.println(zonedDateTime);//4.isXxx 判断 isBefore isAfterSystem.out.println("----------4----------");Instant instant4 = Instant.ofEpochMilli(0L);Instant instant5 = Instant.ofEpochMilli(1000L);boolean result1 = instant4.isAfter(instant5);System.out.println(result1);boolean result2 = instant4.isBefore(instant5);System.out.println(result2);//5.minusXxx 减少时间系列的方法System.out.println("----------5----------");Instant instant6 = Instant.ofEpochMilli(1000L);System.out.println(instant6);Instant instant7 = instant6.minusMillis(1000L);System.out.println(instant7);//6.plusXxx 增加时间系列的方法System.out.println("----------6----------");Instant instant8 = Instant.ofEpochMilli(1000L);System.out.println(instant8);Instant instant9 = instant8.plusMillis(1000L);System.out.println(instant9);}
}
运行结果:
(3)ZoneDateTime:
代码演示:
public class Demo3 {public static void main(String[] args) {//1.获取当前时间对象(带时区)System.out.println("----------1----------");ZonedDateTime now = ZonedDateTime.now();System.out.println(now);//2.获取指定的时间对象(带时区)//年月日时分秒纳秒方式指定System.out.println("----------2----------");ZonedDateTime time1 = ZonedDateTime.of(2024,4,7,12,0,0,0, ZoneId.of("Asia/Shanghai"));System.out.println(time1);//通过Instant + 时区的方式指定获取事件对象Instant instant = Instant.ofEpochMilli(0L);ZoneId zoneId = ZoneId.of("Asia/Shanghai");ZonedDateTime time2 = ZonedDateTime.ofInstant(instant,zoneId);System.out.println(time2);//3.withXxx 修改时间系列的方法System.out.println("----------3----------");ZonedDateTime time3 = time2.withYear(2000);System.out.println(time3);//4.minusXxx 减少时间系列的方法System.out.println("----------4----------");ZonedDateTime time4 = time3.minusDays(365);System.out.println(time4);//5.plusXxx 增加时间系列的方法System.out.println("----------5----------");ZonedDateTime time5 = time3.plusMinutes(60);System.out.println(time5);}
}
运行结果:
2.日期格式化类(SimpleDateFormat):
DateTimeFormater:
代码演示:
public class Demo4 {public static void main(String[] args) {//创建事件对象ZonedDateTime now = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));//创建解析/格式化器DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");//格式化System.out.println(dtf1.format(now));}
}
运行结果:
3.日历类(Calendar):
LocalDateTime(包含LocalDate和LocalTime):
代码演示:
public class Demo5 {public static void main(String[] args) {//获取本地时间的日历对象LocalDateTime ldt1 = LocalDateTime.now();System.out.println(ldt1);int year = ldt1.getYear();int month = ldt1.getMonthValue();int date = ldt1.getDayOfMonth();int hour = ldt1.getHour();int minute = ldt1.getMinute();int second = ldt1.getSecond();System.out.println(year + ", " + month + ", " + date + ", " + hour + ", " + minute + ", " + second);//isXxx 判断LocalDateTime ldt2 = LocalDateTime.of(2000,12,12,0,0);boolean result1 = ldt1.isAfter(ldt2);boolean result2 = ldt1.isBefore(ldt2);System.out.println(result1);System.out.println(result2);//withXxx 修改LocalDateTime ldt3 = ldt2.withYear(2024);System.out.println(ldt3);//minusXxx 减少LocalDateTime ldt4 = ldt2.minusYears(1000);System.out.println(ldt4);//plusXxx 增加LocalDateTime ldt5 = ldt2.plusYears(1000);System.out.println(ldt5);//还可以将LocalDateTime类转换成LocalDate类和LocalTime类//前者只有年月日,后者只有时分秒,方法和本类一致,可套用//转换方法:LocalDate localDate = ldt5.toLocalDate();System.out.println(localDate);LocalTime localTime = ldt5.toLocalTime();System.out.println(localTime);}
}
运行结果:
4.工具类:
ChronoUnit:
代码演示:
public class Demo6 {public static void main(String[] args) {//创建当前时间的日历对象LocalDateTime today = LocalDateTime.now();System.out.println(today);//创建某一天的日历对象LocalDateTime someday = LocalDateTime.of(2000,1,1,1,11);System.out.println(someday);System.out.println("相差的年数:" + ChronoUnit.YEARS.between(someday,today));System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(someday,today));System.out.println("相差的天数:" + ChronoUnit.DAYS.between(someday,today));System.out.println("相差的时数:" + ChronoUnit.HOURS.between(someday,today));System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(someday,today));System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(someday,today));}
}