//Java提供的日期类
import java.util.Date;
//值得注意的一个是Java另外还提供了一个接收SQLDate的类型:
import java.sql.Date// --> 后续再说
浅谈一下计算机时间为什么始于1970年1月1日0时?
System.out.println(Integer.MAX_VALUE);
Integer的范围内最大值–>2147483647 也就是2的31次方-1
Integer在Java中是int的包装类型,4字节也就是32位,所以2147483647也是Integer能表示的最大范围, 一年的总秒数是31,536,000那么计算机最多也就表示到2147483647秒,大概是68.1年
而1970年经过68.1年达到–>2038年01月19日03时14分07秒达到该极限时便会出现时间回归现象,很多软件就会运行异常,但是由于计算机的发展逐渐产生了64位、甚至是128位的计算机
我们以64位为例,64位仍旧以1970年为基准经过换算它能够表示的最大时间是292,277,026,596年12月4日15时30分08秒
大概两亿年后:计算机还存不存在我不知道,反正我是不存在了
包括Java在内的绝大多数编程语言均起源于UNIX系统,而作为最早出现的操作系统考虑到计算机产生的年代和应用的年限(1968年产生),所以综合采用了1970年为基准点 作为UNIX系统的纪元时间,Java自然也遵循了这一约束
/* 获取当前系统时间 */
System.out.println(new Date());
/* 返回距离1970.01.01.0时的毫秒值 */
System.out.println(new Date().getTime());
/* 将毫秒值换算成日期对象 获取的仍然是当前系统时间 */
System.out.println(new Date(new Date().getTime()));
/* 上述方式获取的时间打印格式为: Wed Nov 02 15:50:34 CST 2022 */
/* 此时就需要利用simpleDateFormat来规定和解析日期格式 */
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String format = sdf.format(new Date());
System.out.println(format);
/* 同样我们可以只规定年月日 */
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf2.format(new Date()));
/* 获取时分秒 */
SimpleDateFormat sdf3 = new SimpleDateFormat("hh:mm:ss");
System.out.println(sdf3.format(new Date()));
/* Calendar日历类 */
// Calendar通常不能定义打印的格式 需要开发人员自行组合显示
// public abstract class Calendar implements Serializable, Cloneable, Comparable
// 由于Calendar是抽象类,并且构造器均为protected修饰,所以不能通过new来直接创建示例 要通过API Calendar.getInstance
Calendar cal = Calendar.getInstance();
System.out.println("cal:"+ cal);
System.out.println("通过Calendar获取时区:"+ cal.getTimeZone());
/* 下面用Calendar获取具体字段 */
//获取年 --> 2022年
System.out.println("YEAR= \t"+cal.get(Calendar.YEAR));
//获取月 --> 11月 获取月时返回的是从0开始编号 也就是 1月显示为0月 所以需要+1
System.out.println("MONTH= \t"+(cal.get(Calendar.MONTH)+1));
//获取日 --> 2日
System.out.println("DAY_OF_MONTH= \t"+cal.get(Calendar.DAY_OF_MONTH));
//获取时 --> 16时 两种形式 HOUR(12小时制) 和 HOUR_OF_DAY(24小时制)
System.out.println("HOUR= \t"+cal.get(Calendar.HOUR_OF_DAY));
//获取分 -->
System.out.println("MINUTE= \t"+cal.get(Calendar.MINUTE));
//获取秒
System.out.println("SECOND= \t"+cal.get(Calendar.SECOND));
// 开发人员自行组合打印日期时间
System.out.println((cal.get(Calendar.YEAR)+"年"+(cal.get(Calendar.MONTH)+1))+"月"+cal.get(Calendar.DAY_OF_MONTH)+"日 "+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND));
// 其他的杂七杂八
//获取具体天DAY_OF_YEAR -->(顾名思义一年当中的第几天)
System.out.println("DAY_OF_YEAR= \t"+cal.get(Calendar.DAY_OF_YEAR));
/* Java.time第三代日期类使用 */
LocalDate date = LocalDate.now();
System.out.println("获取日期:"+ date);
LocalTime time = LocalTime.now();
System.out.println("获取时间:"+ time);
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("获取日期+时间:"+ dateTime);
/* 其他用法 */
// -- 获取年
int year = date.getYear();
System.out.println("年:"+year);
// -- 获取月 两种方式 方式一: 此处得到的是一个日期枚举值(英文月份名称)
Month month = date.getMonth();
System.out.println("(方式一)月:"+month);
// 获取月份 方式二: 返回为数值
int month2 = date.getMonthValue();
System.out.println("(方式二)月:"+month2);
// -- 获取日
int days = date.getDayOfMonth();
System.out.println("日:"+days);
// -- 获取时
int hours = time.getHour();
System.out.println("时:"+hours);
// -- 获取分
int minute = time.getMinute();
System.out.println("分:"+minute);
// -- 获取秒
int second = time.getSecond();
System.out.println("秒:"+second);
// 上述分别获取时分秒 是扽别利用了LocalDate和LocalTime 直接用LocalDateTime来获取
System.out.println(dateTime.getYear()+"年"+dateTime.getMonthValue()+"月"+dateTime.getDayOfMonth()+"日 "+dateTime.getHour()+":"+dateTime.getMinute()+":"+dateTime.getSecond());
那么同样的也会有为第三代日期类做出格式规定和解析的方法类–DateTimeFormat
类似于SimpleDateFormat,用法如下:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = LocalDateTime.now();
String format = dtf.format(ldt);
System.out.println(format);
可以看出第三代的LocalDateTime与DateTimeFormat的用法与初代日期类的Date和SimpleDateFormat是相同的
Period:用于计算两个日期的间隔
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.of(2021,10,7);
Period pi = Period.between(ld2,ld1);
System.out.println(pi);
// pi打印结果为--> P1Y1M1D 代表:Period 1 year 1 Month 1 Day
int years = pi.getYears();
System.out.println(years);
int months = pi.getMonths();
System.out.println(months);
int days = pi.getDays();
System.out.println(days);
long all = pi.toTotalMonths();
System.out.println("总月份:"+all);
Duration:用于计算两个时间点的间隔
/* Duration计算时间间隔用法 */
LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.of(2022,11,2,12,0);
Duration between = Duration.between(ldt2,ldt1);
System.out.println(between);
//between打印结果 --> PT6H54M39.48S 代表 6 Hours 54 Minutes 39.48 Scond
//相差总天数
System.out.println("相差总天数"+between.toDays());
//相差总小时数
System.out.println("相差总小时数"+between.toHours());
//相差总分钟数
System.out.println("相差总分钟数"+between.toMinutes());
//相差总秒数
System.out.println("相差总秒数"+between.getSeconds());
//相差总毫秒数
System.out.println("相差总毫秒数"+between.toMillis());
//相差总纳秒数
System.out.println("相差总纳秒数"+between.toNanos());
//相差不足一纳秒的纳秒数
System.out.println("相差不足一纳秒的纳秒数"+between.getNano());