目录
全世界世界统一相关标准
地球经线连接南北两级
纬线与赤道平行
在1884年以英国格林威治的时间作为标准时间(GreenWitch Mean Time) 简称GMT
计算核心:以地球自转一天为24小时 太阳直射时为正午12点
以本初子午线为界右为东部地区,左为西部地区
各分12区,我国处于东八区
以本初子午线为零点时,东部加上区数表示时间,西部则减去区数
地球同一条经线的时间是一样的
直到2012年1月份
利用原子钟作为全世界统一计算标准
原理:利用铯原子的震动频率来计算时间,作为世界标准时间(UTC)
铯原子震动9192631770次为一秒
号称两千万年误差1秒
JDK7以前的时间相关类
DAate 时间
Date类时JDK中的一个Javabean类,用来描述时间,精确到毫秒
毫秒值为从时间原点到现在过了多少毫秒
时间原点:1970年1月1日0点0分0秒
中国处于东八区所以在时间原点上加8小时
利用空参构造创建的对象,默认表示当前时间
java.util.Date d=new java.util.Date();
System.out.println(d);
网络时间 五月 时分秒 GMT标准时间+8小时 年份
在使用Date类创建对象时一定要使用JAVA.util包下的
这个包下重写了toString方法,能够较标准的输出时间
不重写toString方法会直接打印对象地址值
利用有参构造创建的对象表示指定的时间
java.util.Date d1=new Date(0l);
System.out.println(d1);
利用有参构造创建的对象会在时间原点上加上传入参数来表示时间
参数为0(后面是L,表示long类型)则表示在时间原点加0毫秒
1000毫秒表示1秒
set和get方法
set是在调用对象的基础上添加毫秒
get返回调用对象距离时间原点多少毫秒
java.util.Date d1=new Date(0l);
System.out.println(d1);
d1.setTime(1000l);
System.out.println(d1);
long l= d1.getTime();
System.out.println(l);
SimpleDateFormat 格式化时间
SimpleFormat出现的原因:使用Date获取时间的格式单一,且不符合我们的阅读习惯(其实是英文不行)
格式化时间常用模式对应关系
y--年 M--月 d--日
H--时 m--分 s--秒
例:2023-11-11 13:27:06 2023年11月11日 13时27分06秒
yyyy-MM-dd HH:mm:ss yyyy年MM月dd日 HH时mm分ss秒
注:中间的空格不可省略
构造方法
1:空参构造 ——默认格式
public SimpleDateFormat02()
2:带参构造——指定格式
public SimpleDateFormat02(String pattern)
SimpleDateFormat s=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE");
常用方法
1:format
public final String format(Date date)
Date d=new Date();
SimpleDateFormat s=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE");
String str2=s.format(d);
System.out.println(str2);
格式化(日期对象->字符串)
将日期对象Date转化为指定格式字符串
2:parse
public Date parse(String source)
SimpleDateFormat s2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EE");
String str3="2023-05-03 17:59:11 周三";
Date date=s2.parse(str3);
System.out.println(date);
解析(字符串->日期对象)
将字符串转化为日期对象
创建SimpleDateFormat对象时应使用带参构造,且指定格式与字符串日期格式相同
SimpleDateFormat作用
1:格式化:将时间变成我们喜欢的格式
例:2023年10月1日 2023-10-1 2023/10/1
2:解析:将字符串表示的时间变成Date对象
Calender 日历类
Calender代表了系统当前时间的日历对象,可以单独修改,获取时间中的年月日
Calender是一个抽象类,不能直接创建对象
获取Calender对象的方法
public static Calender getInstance()
Calendar c=Calendar.getInstance();
1:获取当前时间的日历对象
底层原理:会根据不同的时区获取不同的日历对象,默认表示当前时间
将时间中的纪元,年,月,日,时,分,秒,星期等等全部放到一个数组中
java.util.GregorianCalendar[time=1683110383594,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=1,DAY_OF_MONTH=3,DAY_OF_YEAR=123,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=39,SECOND=43,MILLISECOND=594,ZONE_OFFSET=28800000,DST_OFFSET=0]
2:细节
1:月份范围0-11 所以获取到的月份要加一
2:星期:在老外眼中星期日是一周的第一天
所以1星期日, 2星期一,3星期二,4星期三,5星期四,6星期五,7星期六
Calender常用方法
getTime() 获取日期对象
setTime(Date date) 给日历设置日期对象
getTimeMillis() 拿到时间毫秒值
setTimeMillis(long millis) 给日历设置时间毫秒
get(int field) 取日历中某个字段信息
set(int field,int value) 修改日历的某个字段信息
add(int field,int amount) 为某个字段增加或减少指定的值
field参数对应为
0:纪元
1:年
2:月
3:一年中的第几周
4:一个月中的第几周
5:一个月中的第几天
......
传入field参数为几就会对对应的字段执行相应方法
JAVA在Calender类中将索引对应的数字都定义为了常量
JDK8新增的时间相关类
为什么新增JDK8时间相关类
1:JDK7的时间类代码麻烦,时间对象在计算与比较时只能转换为毫秒值计算
JDK8新增的时间类带有判断时间大小与计算时间间隔的方法
2:JDK7多线程下会导致数据安全问题
JDK8时间日期对象都是不可变的,解决了这个问题
新增的时间类与旧时间类的联系
1:Date类
zoneId:时区
Instant:时间戳
ZoneDateTime:带时区的时间
2:日期格式化类SimpleDateFormat
DateTimeFormatter:用于时间的格式化和解析
3:日历类Calender
LocalDate:年,月,日
LocalTime:时,分,秒
LocalDateTime:年,月,日,时,分,秒
4:工具类
Duration:时间间隔(秒,纳秒)
period:时间间隔(年,月,日)
ChronoUnit:时间间隔(所有单位)
ZoneId 时区
常用方法
1:getAvailableZoneIds
获取Java中所支持的所有时间
static set<String> getAvailableZoneIds()
2:systemDefault
获取系统默认时区
static ZoneId systemDefault()
3:of
获取一个指定时区
static ZoneId of(String zoneId)
示例:
System.out.println(ZoneId.getAvailableZoneIds());
ZoneId z= ZoneId.systemDefault();
System.out.println(z);
ZoneId z1=ZoneId.of("Etc/GMT+8");
System.out.println(z1);
Instant
static Instant now()
获取当前时间的Instant对象(标准时间)
Instant now=Instant.now();
System.out.println(now);
System.out.println("___________________________");
static Instant ofxxx(long epochMilli)
根据(秒/毫秒/纳秒)获取Instant对象
Instant instant1=Instant.ofEpochMilli(1l);
System.out.println(instant1);
Instant instant2=Instant.ofEpochSecond(1);
System.out.println(instant2);
Instant instant3=Instant.ofEpochSecond(1l,1l);
System.out.println(instant3);
System.out.println("___________________________");
ZonedDateTime atZone(ZoneId zone)
指定时区
ZonedDateTime zonedDateTime=Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime);
System.out.println("_______________________");
boolean isXxx(Instant otherInstant)
判断系列的方法
Instant instant4=Instant.ofEpochMilli(0l);
Instant instant5=Instant.ofEpochMilli(1000l);
System.out.println(instant4.isBefore(instant5)); //判断调用者是否在参数前
System.out.println(instant4.isAfter(instant5)); //判断调用者是否在参数后
System.out.println("___________________");
Instant minusXxx(long millisToSubtract)
减少时间系列的方法
Instant instant6=Instant.ofEpochMilli(0l);
Instant instant7=instant6.minusSeconds(1l);
System.out.println(instant6);
System.out.println(instant7);
System.out.println("____________________");
Instant plusXxx(long millisToSubtract)
增加时间系列的方法
Instant instant8=Instant.ofEpochMilli(0l);
Instant instant9=instant8.plusSeconds(1);
System.out.println(instant8);
System.out.println(instant9);
ZoneDateTime
常用方法
1:
2:
3:
4:
5:
DateTimeFormatter
用于时间的格式化与解析
LocalDate
仅能获取或修改日历中的年月日
常用方法
常用方法示例
LocalTime
仅能获取或修改日历中的时分秒
常用方法
常用方法示例
LocalDateTime
可以修改日历年月日时分秒全部
可以转换成LocalDate或LocalTime对象
常用方法
常用方法示例
Duration
计算时间间隔,秒,纳秒的计算
period
计算时间间隔,年月日
ChronoUnit
计算时间间隔,所有单位