日期和时间类【Date】【Calendar日历类】【LocalDate】Date-Time API详解 ...

打印 上一主题 下一主题

主题 1872|帖子 1872|积分 5616

我们先来介绍一下与时间干系的底子知识。
GMT - 格林尼治标定时间(Greenwich Mean Time),简称GMT,实际上与世界时UT(universal time )基本一致。
UTC - 协调世界时(Universal Time Coordinated),简称UTC,比GMT更精确。
LT - 本地时间(Local Time),简称LT,表示地点时区的时间。
CST - 北京时间(China standard Time),中国标定时间。
时区:整个地球分为二十四时区,每个时区都有本身的本地时间。UTC或GMT与LT有如下换算关系:LT = UTC + 时区差。
东区是加相应的时区差,西区是减时区差。例如,CST-北京时间,在时区划分上,属东八区,比UTC协调世界时早8小时,记为UTC+8。

时间戳:UTC时间的原点是:1970年1月1日00:00:00。在中国,CST-北京时间比UTC协调世界时早8小时。因此,在中国,时间戳是自1970年1月1日(08:00:00GMT)至当前时间的总秒数,它也被称为Unix时间戳(unix Timestamp),广泛的应用在知识产权保护、条约签字、金融帐务、电子报价投标、股票买卖业务等方面,作为时间标记。
另外,尚有三个关于时间单位的换算公式:
(1)1秒 = 1000毫秒;
(2)1毫秒 = 1000微秒;
(3)1微秒 = 1000纳秒。
“逝者如斯夫,不舍昼夜”是《论语·子罕》中纪录的孔子的名言。孔子在河边看到河水不断流淌,有感而发,形容时间就像这河水一样,不分昼夜地流逝,提醒人们要爱惜时间。这句话不仅表达了时间的流逝不可逆转,也寓意着人们应该爱惜每一刻,不要虚度光阴。
在计算机世界,我们是以1970 年 1 月 1 日 00:00:00作为基定时间,是UTC时间的原点。时间计算最常用的度量单位是毫秒(1秒的千分之一),时间是一维空间,如下图所示:

我们用long类型的变量来表示时间,从基定时间往前几亿年,以后几亿年都能表示。如果想得到当前时刻的“时刻数值”,代码如下:
  1.         long now = System.currentTimeMillis();
复制代码
这个“时刻数值”是所偶尔间类的核心值,年月日都是根据这个“数值”计算出来的。JDK 8 以前的时间日期干系类的关系如下所示:

一、 日期类Date
JDK 8以前的版本,通常用Date类(java.util.Date)来处置惩罚日期、时间:包括创建日期、时间对象;获取系统当前日期和时间等。
Date类用于表示日期和时间,是公历(阳历)表示法,表示特定的瞬间,精确到毫秒。Date类表示的日期和我们对日期的认知略有差异:


  • Date类定义的日期有一个起始点,是UTC时间:1970年1月1日00:00:00。
  • 年份由整数表示,但是Date类的年份是从1900年开始算起的,若Date类的年份为y,那么实际年份应当是 y + 1900。
  • 月份也由整数表示,Date类(java.util.Date)的月份是从0至11的整数表示,一月是0、二月是1,由此类推十二月是11。
  • 日期(一月中的某天)按通常方式由整数 1 至 31 表示,这点和我们的认知一致。
  • 小时由从 0 至 23 的整数表示。因此,从半夜到 1 a.m. 的时间是 0 点,从中午到 1 p.m. 的时间是 12 点,这点也和我们的认知一致。
  • 分钟按通常方式由 0 至 59的整数表示。
时间类Date有两个常用方法:
Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒。
long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
二、DateFormat类和SimpleDateFormat类
DateFormat类的作用:
把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。
DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。
日期时间格式化占位符的含义:

Date日期时间类及其日期时间格式测试:
  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. public class testDate {
  4.         public static void main(String[] args) throws Exception  {
  5.         // 定义输出格式   
  6.         SimpleDateFormat sdf = null;
  7.         sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  8.       
  9.         Date date = new Date(); //获取系统当前日期
  10.         System.out.println(date); //打印当前年月日
  11.         System.out.println(date.getTime());//打印当前时间
  12.         // 将日期转化为字符串
  13.         String str = sdf.format(date);
  14.         System.out.println(str);
  15.         
  16.         //把字符串转化为日期Date对象
  17.         sdf = new SimpleDateFormat("yyyy年MM月dd日");
  18.         String string = "2024年01月18日";
  19.         date = sdf.parse(string);
  20.         System.out.println(date);
  21.         }
  22. }
复制代码
测试效果效果:

三、Calendar日历类
Calendar 类是一个抽象类,为我们提供了关于日期计算的干系功能,比如:年、月、日、时、分、秒的展示和计算。
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地域使用的标准日历系统。
注意 月份的表示,一月是0,二月是1,以此类推,12月是11。 因为大多数人习惯于使用单词而不是使用数字来表示月份,这样步伐大概更易读,父类Calendar使用常量来表示月份:JANUARY、FEBRUARY等等。
Java语言对日期时间类Date的设计很差,日期的格式处置惩罚定义在java.text包中,而且java.util.Date是非线程安全的。
另外,在java.sql 包中有java.util.Date类的三个子类:
(1)java.sql.Date 只表示日期(JDBC日期转义格式:yyyy-mm-dd)
(2)java.sql.Time 只表示时间(JDBC时间转义格式:hh:mm:ss)
(3)java.sql.Timestamp 时间戳同时包含日期和时间信息(JDBC时间戳转义格式:yyyy-mm-dd hh:mm:ss.fffffffff)
JDK1.1之后,日期操作一般使用Calendar类,而字符串的转化使用DateFormat类的实现类SimpleDateFormat。
下面请看一个Calendar 类的演示例程:
  1. /***
  2. * @author QiuGen
  3. * @description  CalenderDemos
  4. * @date 2024/9/18
  5. * ***/
  6. import java.util.Calendar;
  7. import java.util.GregorianCalendar;
  8. public class CalenderDemos {
  9.         public static void main(String[] args)
  10.         {
  11.                 Calendar c =  new GregorianCalendar(); //创建公历日历
  12.                 prnWeek(c);
  13.                 c.set(2023, 8, 16);//设置为2023年 9月 16日
  14.                 prnWeek(c);
  15.         }
  16.         private static void prnWeek(Calendar c) {
  17.                 int year = c.get(Calendar.YEAR);
  18.         int month = c.get(Calendar.MONTH)+1;
  19.         int day = c.get(Calendar.DAY_OF_MONTH);
  20.         //int week = c.get(Calendar.DAY_OF_WEEK);
  21.         String week = getWeek( c.get(Calendar.DAY_OF_WEEK) );
  22.         System.out.println(year+"年 "+month+"月 "+day+"日 "+week);
  23.         }
  24.         private static String getWeek(int week)
  25.         {
  26.                  String[] weeks = { "","星期日" ,"星期一" ,"星期二" ,
  27. "星期三" ,"星期四" ,"星期五" ,"星期六" };     
  28.          return weeks[week];       
  29.         }
  30. }
复制代码
测试效果:

四、Java 8的日期时间Date-Time API
JDK 1.0发布的日期时间类java.util.Date类有很大缺陷,自从JDK 1.1引入日历类Calendar之后Date类的很多方法就被弃用。然而日历类Calendar也不尽如人意。它们都是线程不安全的,而且都有不能处置惩罚闰秒(每隔2天,多出1s)等缺陷。
Java 8又引入了新的Date-Time API(JSR 310),也就是java.time包,来改善日期、时间的处置惩罚。
新版的日期时间处理类重要包含三个核心类:


  • LocalDate:表示日期(年-月-日),是不可变日期时间对象,接纳了系统的默认时区。只包含日期,可以获取日期字段。
  • LocalTime:表示一天中的时间,只包含时间,可以获取时间字段。
  • LocalDateTime:包含了日期和时间,可以获取日期和时间字段,表示本地日期时间,默认使用系统时区。LocalDateTime相当于LocalDate + LocalTime的组合体。
新版的日期时间处理类还包含了一些辅助类:


  • Instant 时间戳类。Instant表示时间的瞬间,和前面Date类类似。相较于System.currentTimeMillis()只能获取到【毫秒】,Instant可以更为精确的获取到【纳秒】。Instant类提供了大量与Date类相互转换的方法。
  • Clock 时钟类。用于获取当时的时间戳,或当前时区下的日期时间信息。以前使用System.currentTimeMillis()和TimeZone.getDefault()方法的地方都可使用Clock来替换。
  • DateTimeFormatter 日期时间格式化类。
凡是须要显示日期和时间的地方,都可根据用户需求按肯定样式规则进行格式化。下面是常用的日期时间格式化样式中用到的占位符:

常用的日期、时间格式化的样式:
年份:(占位符,用大小写皆可)
YYYY :4位数字表示的年份,例如:2023
yyyy :4位数字表示的年份,例如:2023
YY :2位数字表示的年份,例如:23
月份:(占位符M,必须用大写)
MM :2位数字表示的月份,例如:01表示一月,12表示十二月
MMM :英文缩写形式的月份,例如:Jan表示一月,Dec表示十二月
MMMM :完备的英文月份,例如:January表示一月,December表示十二月
日期:(DD大写,dd小写,皆可)
DD dd :2位数字表示的日期,例如:01表示1号,31表示31号
星期几:(占位符d,必须用小写)
ddd :英文缩写形式的星期几,例如:Mon表示星期一,Sun表示星期日
dddd :完备的英文星期几,例如:Monday表示星期一,Sunday表示星期日
时间:
HH :24小时制的小时,例如:00表示半夜12点,23表示晚上11点
hh :12小时制的小时,例如:01表示上午1点,12表示下午12点
mm :分钟,例如:00表示整点,30表示30分钟
ss :秒,例如:00表示整分,59表示59秒
S:毫秒,当前秒的毫秒数。
am/pm :上午/下午标识,例如:AM表示上午,PM表示下午。大小写皆可。
ISO本地化日期样式: yyyy-MM-dd
ISO本地化时间样式: HH:mm:ss
三个日期时间处理核心类都提供了静态now()方法来获取当前的系统日期或时间。例如:LocalDate类可用静态的now()方法来获取当前日期:
LocalDate localDate = LocalDate.now();
还定义了大量的日期时间处置惩罚方法,例如:通过加减计算日期的方法
在当前日期加上肯定时间值计算以后的某个时间日期的方法:
localDate.plusDays(daysToAdd);
localDate.plusMonths(monthsToAdd);
localDate.plusYears(yearsToAdd);
在当前日期上减去肯定时间值计算以前的某个时间日期的方法:
localDate.minusDays(daysToSubtract);
localDate.minusMonths(monthsToSubtract);
localDate.minusYears(yearsToSubtract);
Date-Time API中很多类都提供了闰年和平年的判断方法isLeapYear()。
老式使用Date()格式化显示的这种写法:
  1. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2. System.out.println("【" + format.format(new Date()) + "】" );
复制代码
与下面使用Date-Time API的写法,功能完全相同:
  1.                 String dateTime = LocalDate.now() + " " + LocalTime.now();
  2.                 System.out.println("【" + dateTime +"】");
复制代码
例程DateTimeAPITest.java演示一些常用的方法,源代码如下:
  1. import java.time.LocalDate;
  2. import java.time.LocalDateTime;
  3. import java.time.LocalTime;
  4. import java.time.format.DateTimeFormatter;
  5. public class DateTimeAPITest {
  6.         public static void testLocalDate() {
  7.                 LocalDate date = LocalDate.now(); //获取系统当前日期
  8.         System.out.println(date);   //打印当前年月日
  9.         System.out.println(date.getYear());//获取当前年份
  10.         System.out.println(date.getMonth().getValue());//获取当前月份序号
  11.         System.out.println(date.getDayOfMonth());//获取今天几号
  12.         
  13.         DateTimeFormatter f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  14.         System.out.println(date.format(f1));
  15.         }
  16.         public static void testLocalTime() {
  17.         LocalTime time = LocalTime.now();
  18.         System.out.println(time);//获取当前的时间
  19.         System.out.println(time.getHour());//获取当前时间的小时
  20.         System.out.println(time.getMinute());//获取当前时间的分钟
  21.         System.out.println(time.getSecond());//获取当前时间的秒
  22.         
  23.         DateTimeFormatter f1 = DateTimeFormatter.ofPattern("HH:mm:ss");
  24.         System.out.println(time.format(f1));
  25.         }
  26.        
  27.         public static void testLocalDateTime() {
  28.         LocalDateTime dateTime = LocalDateTime.now();
  29.         System.out.println(dateTime);//获取当前的年月日时分秒
  30.         System.out.println(dateTime.getYear());//获取当前年份
  31.         System.out.println(dateTime.getMonth().getValue());//获取当前月
  32.         System.out.println(dateTime.getDayOfMonth());//获取当前几日
  33.         System.out.println(dateTime.getHour());//获取当前小时
  34.         System.out.println(dateTime.getMinute());//获取当前分钟
  35.         System.out.println(dateTime.getSecond());
  36.         System.out.println(dateTime.getDayOfWeek());//今天是星期几
  37.         DateTimeFormatter f1 = null;
  38.                 f1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  39.         System.out.println(dateTime.format(f1));
  40.         }
  41.         public static void main(String[] args)  {
  42.                 //testLocalDate();
  43.                 //testLocalTime();
  44.                 testLocalDateTime();
  45.         }
  46. }        //例程DateTimeAPITest.java结束。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表