一、java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差(时间戳)。此方法适于计算时间差。·
计算世界时间的主要标准有:
UTC(Coordinated Universal Time)
GMT(Greenwich Mean Time)
CST(Central Standard Time)
二、java.util.Date类
2.1、两个构造器的使用
(1)构造器一:Date(): 创建一个对应当前时间的Date对象
(2)构造器二:创建指定毫秒数的Date对象
2.2、两个方法的使用
toString():显示当前的年、月、日、时、分、秒
getTime():获取当前的Date对象对应的时间戳。
exp:
Date date1 = new Date(); //创建一个对应当前时间的Date对象
System.out.println(date1.toString());//Thirsday Oct 29 21:42:49 GMT+08:00 2020
System.out.println(date1.getTime());//21092009100940ms
三、java.text.SimpleDateFormat类
背景:Date类的API不易于国际化,大部分被废弃了, java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化:日期->文本、 解析:文本->日期
1、格式化:日期->指定格式的字符串(文本)
(1)SimpleDateFormat() :构造器:默认的模式和语言环境创建对象。此模式只能用固定格式处理日期
(2)public SimpleDateFormat(String pattern):构造器:可以用参数pattern指定的格式创建一个对象,该对象调用
(3)public String format(Date date):方法格式化时间对象date
2、解析:格式化的逆过程 指定格式字符串(文本)->日期
public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。需要注意格式,格式不对会抛异常
3、exp1 默认空参构造器创建 和 解析日期 默认日期格式
SimpleDateFormat sdf = new SimpleDateFormat();//使用空参构造器实例化SimpleDateFormat对象 sdf
Date date=new Date();//创建一个日期对象,默认是当前日期
String format=sdf.format(date);//通过对象调用类的format方法,格式化时间。日期->指定格式的字符串(文本)
String str = "20-10-29 下午14:20"; //注意,日期格式不对会抛异常
Date date1 = sdf.parse(str);//通过对象调用类的parse方法,解析字符串,以生成一个日期
exp2:用带参数的构造器,可以自己指定日期格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//按照指定格式实例化对象
String format1 = sdf1.format(new Date());//按照yyyy-MM-dd hh:mm:ss格式,格式化当前时间
Date date2 = sdf1.parse("2020-10-29 22:43:18);//注意格式,sdf1对象只能解析yyyy-MM-dd hh:mm:ss 字符串的时间
四、java.util.Calendar 日历类
4.1简介:
1、Calendar是一个抽象基类,主要用于完成日期字段之间的互相操作功能
2、获取Calendar实例的方法
(1)使用Calendar.getInstance()方法 //这个方法获取的还是子类GregorianCalendar的对象
(2)调用它的子类GregorianCalendar的构造器
3、一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR,MONTH,DAY_OF_WEEK,HOUR_OF_DAY,MINUTE,SECOND。这些常量是static 类属性
public void set(int field, int value) //将YEAR,MONTH等属性设定成指定值
public void add(int field,int amount) //再现有的时间上,加时间
public final Date get(int field) //field就是指的属性,就是YEAR,MONTH这些常量。就是获取年,月,日等
public final void setTime(Date date) //将当前日历改成Date内容 Date类,转换为 日历类
public final void getTime(Date date) //日历类 转换为 Date类
注意:
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周一是2,,,,周六是7
exp:
Calendar calendar = Calendar.getInstance();//用类的static方法创建GregorianCalendar对象对象,因为抽象类没法实例化
int days = calender.get(Calender.DAY_OF_MONTH);//通过对象调用类的get方法,获取本月第几天
calender.set(Calender.DAY_OF_MONTH,22);//设置为本月第22天
calender.add(Calender.DAY_OF_MONTH,3);//再加3天,现在本月底25天
Date date = calendar.getTime(); //将calendar对象的时间转换为Date类 并赋值给date
calendar.setTime(date);//将date类日期作为参数给日历对象,日历对象的日期变成传入日期
五、 JDK8 新日期
5.1新日期时间API出现的背景
如果我们可以跟别人说: “我们在1502643933071见面,别晚了! "那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了.JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:
(1)可变性:像日期和时间这样的类应该是不可变的。
(2)偏移性: Date中的年份是从1900开始的,而月份都从0开始。
(3)格式化:格式化只对Date有用, Calendar则不行。此外,它们也不是线程安全的;不能处理闰秒等。
5.2 新时间日期API
第三次引入的API是成功的,并且Java 8中引入的java.time API已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。
Java 8吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API新的java.time中包含了所有关于本地日期(LocalDate) 、本地时间(LocalTime)、本地日期时间(LocalDateTime) 、时区(ZonedDateTime和持续时间(Duration)的类。历史悠久的Date类新增了tolnstant()方法用于把Date转换成新的表示形式。这些新增的本地化时间口期API大大简化了日期时间和本地化的管理。
java.time-包含值对象的基础包
java.time.chrono-提供对不同的日历系统的访问
java.time.format-格式化和解析时间和日期
java.time.temporal-包括底层框架和扩展特性
java.time.zone-包含时区支持的类
说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。
5.3 本地日期(LocalDate) 、本地时间(LocalTime)、本地日期时间(LocalDateTime)
这三个类的实例是不可改变对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关内容的信息
类似于Calendar类,但是相比不用修正偏差,并且方法带返回值,本身不直接改变对象里的内容。是否覆盖原对象,看开发者心情了。
LocalDate 代表 IOS格式(yyyy-MM-dd)的日期,可以存储生日、纪念日等日期。(年月日)
LocalTime表示一个时间,而不是日期。(时分秒)
LocalDateTime用来表示日期和时间,最常用类之一。(年月日+时分秒)
说明:ISO-8601日历系统是国际标准组织制定的现代公民的日期和时间的表示法,也就是公历。
1、实例化方法 三个类的方法都一样,以LocalDateTime为例
(1)用类的static方法,now()方法来实例化不对,非用构造器
语法:类名 变量名 = LocalDateTime.now();
exp: LocalDateTime localDateTime=LocalDateTime.now(); //用类的now()方法实例化了一个LocalDateTime对象
(2)用类的static方法,of()方法 可设置指定的年、月、日、时、分、秒(比起前面的好处是 没有偏移量)
语法:类名 变量名 = LocalDateTime.of(int year,int month,int day,....);
exp:LocalDateTime localDateTime1=LocalDateTime.of(2020,11,1,14,17,15);
说明:用类的of()方法实例化了一个LocalDateTime对象,2020年11月1日14时17分15秒
2、获取那些实例化好的时间对象里面的时间(对象属性) 方法 getXxx()
语法:时间对象.getDayOfMonth();
exp:LocalDateTime localDateTime1=LocalDateTime.of(2020,11,1,14,17,15);
localDateTime1.getDayOfMonth();//输出1,本月第一天
说明:获取当前时间对象表示的是这个月第几天(某个属性)。getXxx可以获取很多的属性,具体查字典啦
3、withXxx()方法 设置对象表示的时间 具体查字典
5.4 instant类 瞬时 给计算机看的,前面的是给人看的
1、Instant类 瞬时 简介
Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳。
类似于java.util.Date类 很多方法和属性都相似。
在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
(1 ns=10负九次方秒) 1秒= 1000毫秒=10^6微秒=10^9纳秒
2、实例化方法:
(1)静态方法now() 静态方法,默认返回UTC时区的Instant类对象
语法:Instant 类对象名 = Instant.now(); //通过类的静态方法now() 实例化Instant对象
exp:Instant instant = Instant.now();
说明:这个时间不是我们实际的时间啦。是本初子午线时区的时间。我们的时间要在那个基础上+8个小时。
(2)ofEpochMilli():类的static方法 通过给定的毫秒数,获取Instant实例
语法:Instant 类对象名 = Instant.ofEpochMilli(long 毫秒数);
exp:Instant instant1 = Instant. ofEpochMilli(12124123123123123L);
3、其他方法 查字典
5.5 格式化与解析日期或时间 java.time.format.Date TimeFormatter类
说明:定义一个格式对象,去格式化各种时间类对象
1、简介:
该类用于格式化或解析日期、时间。类似于SimpleDateFormate。 即将日期或时间转成字符串
2、实例化格式对象 (只说重点方法,其他查字典)
语法:DateTimeFormatter 对象名 = 类名.ofPattern("自定义时间格式");//后面就会按照这个格式去解析时间对象
exp:DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); /*实例化时间格式对象,将格式设置为yyyy-MM-dd hh:mm:ss*/
String str = formatter3.format(LocalDateTime.now()); //按照yyyy-MM-dd hh:mm:ss格式,格式化时间