[学习笔记] 日期和时间
日期(Date)和时间(Time)是计算机可以处理的重要数据;
日期代表日历中的某一天,由年/月/日组成,被看作是离散的数据;
时间代表某个时间点,由时/分/秒组成;
本地时间
我们通常说的时间指的是本地时间,即本时区时间。同一时刻,不同时区的本地时间不同。
时区
由于存在时区的概念,带有日期的时间依然无法准确指明某个时刻,还需要给日期和时间加上时区信息才能准确表示当前时刻;
目前,全球一共分为24时区,以伦敦所在时区为标准时区,其他时区以东/西偏移的小时数区分;
时区的表示方式
1 使用GMT/UTC+时区偏移量表示,例如GMT+8:00或UTC+8:00表示东八区
相比于GMT,UTC使用更精确的原子钟计时,但基本上可以认为GMT和UTC相同;
2 缩写
CST可以是China Standard Time的缩写,表示中国标准时间;
CST也可以是Central Standard Time(USA)的缩写,表示美国中部时间;
CST还可以是Central Standard Time(Australia)的缩写,表示澳大利亚中部时间;
由此可见,使用缩写容易产生混淆,所以不推荐使用;
3 用洲/城市表示
城市名使用的是国际标准组织规定的城市名,例如Asia/Shanghai表示上海所在的时区
夏令时
夏令时(Daylight Saving Time)/夏时制又称"日光节约时制"和"夏令时间"。在这一制度实施期间的时间称为"夏令时间";
采用夏令时,就是在夏季人为的将时间调快1小时,当夏令时结束后,就会将时间调慢1小时;
本地化
在计算机中,可以将日期、时间、数字、货币等数据的格式按Locale信息进行本地化;
Locale由语言_国家的字母缩写而成,比如zh_CN表示中文_中国,en_US表示英文_美国,语言使用小写,国家使用大写;
新纪元时间/历元时间
历元时间是从1970年1月1日零点(格林威治时区/GMT+0:00)到当前时刻所经过的秒数;
历元时间又称时间戳,有多种存储方式:
- 以秒为单位的整数:1652966134,精度只能到秒;
- 以毫秒为单位的整数:1652966134280,最后三位表示毫秒数;
- 以秒为单位的浮点数:1652966134.280,小数点后表示毫秒数;
Java中的时间戳通常是long表示的毫秒数,要获取当前时间戳,可以使用System.currentTimeMillis()
System.out.print(System.currentTimeMillis());
输出为:
1652966134280 //以毫秒为单位的整数
Java标准库提供的处理日期和时间的API
Java标准库有两套处理日期和时间的API:一套定义在java.util包,它主要包括Date、Calendar和TimeZone这几个类;一套定义在java.time包,它主要包括LocalDateTime、ZonedDateTime这几个类;
Date类
java.util.Date类封装当前的日期和时间,它提供了两个构造方法实例化Date对象;
Date( ) //使用当前日期和时间初始化对象
Date(long millisec) //接收一个参数初始化对象,该参数是从1970年1月1日零点起的毫秒数
获取当前日期和时间并输出
Date date=new Date(); System.out.print(date); //Thu May 19 21:47:45 GMT+08:00 2022
Date总是以当前计算机系统的默认时区输出日期和时间,除了使用toGMTString()方法按GMT+0:00的时区格式化日期和时间外,不能转换时区并且很难对日期和时间进行加减以计算两个日期之间相差多少天;
Calendar类
Calendar类可以用于获取和设置年、月、日、时、分、秒,相比于Date类,Calendar类可以进行简单的日期和时间的计算;
Calendar类获取当前时间
System.out.print(Calendar.getInstance());
//输出:
//java.util.GregorianCalendar[time=1653054546124,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=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=4,WEEK_OF_YEAR=21,WEEK_OF_MONTH=3,DAY_OF_MONTH=20,DAY_OF_YEAR=140,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=49,SECOND=6,MILLISECOND=124,ZONE_OFFSET=28800000,DST_OFFSET=0]
使用Calendar类设置时间
Calendar cal=Calendar.getInstance(); //获取当前时间
cal.clear(); //清除所有字段
cal.set(Calendar.YEAR,2022); //设置年份为2022
Calendar对象转Date对象
Calendar cal=Calendar.getInstance();
Date date=cal.getTime();
使用功能Calendar类的getTime()方法可以将Calendar对象转换为Date对象
GregorianCalendar类
Calendar类实现了公历日历,是一个抽象类,GregorianCalendar类是Calendar类的一个具体实现;
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象;
格式化日期和时间
使用SimpleDateFormat格式化日期
Date date = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); System.out.print(ft.format(date));
SimpleDateFormat方法中指定的字符串规定了日期和时间输出的格式
使用printf格式化日期
Date date = new Date(); System.out.printf("%tD", date);