【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
应用实时监控服务-应用监控,每月50GB免费额度
简介: java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。

1. Java 日期时间:

java.util 包提供了 Date 类来封装当前的日期和时间。

Date 类提供两个构造函数来实例化 Date 对象。

  • 第一个构造函数使用当前日期和时间来初始化对象。
    Date( )

  • 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
    Date(long millisec)

1.1 日期比较:

Java使用以下三种方法来比较两个日期:

  • 使用getTime()方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。

  • 使用方法before(),after() 和 equals()
    例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。

  • 使用 compareTo()方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

使用 SimpleDateFormat 格式化日期

  • SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。
  • SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。

例如:

import java.util.*;
import java.text.*;

public class DateDemo {
   
   public static void main(String args[]) {
   
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

      System.out.println("Current Date: " + ft.format(dNow));
   }
}
  • 以上代码输出了:当前的时间
    SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
    这一行代码确立了转换的格式
  • ==其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。==

注意:有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制。

1.2 日期和时间的格式化编码:

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

字母 描述 示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h A.M./P.M. (1~12)格式小时 12
H 一天中的小时(0~23)格式小时 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2(Second Wed. in july)
w 一年中的第几周 40
W 一个月中的第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
' 文字定界符 Delimiter
" 单引号 '

例子:

import java.util.Date;
public class DateDemo {
   
  public static void main(String args[]) {
   
     // 初始化 Date 对象
     Date date = new Date();
     //c的使用 
    System.out.printf("全部日期和时间信息:%tc%n",date);         
    //f的使用 
    System.out.printf("年-月-日格式:%tF%n",date); 
    //d的使用 
    System.out.printf("月/日/年格式:%tD%n",date); 
    //r的使用 
    System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date); 
    //t的使用 
    System.out.printf("HH:MM:SS格式(24时制):%tT%n",date); 
    //R的使用 
    System.out.printf("HH:MM格式(24时制):%tR",date); 
  }
}

以上实例编译运行结果如下:

全部日期和时间信息:星期一 九月 10 10:43:36 CST 2012  
年-月-日格式:2012-09-10  
月/日/年格式:09/10/12  
HH:MM:SS PM格式(12时制):10:43:36 上午  
HH:MM:SS格式(24时制):10:43:36  
HH:MM格式(24时制):10:43

如果你需要重复提供日期,那么利用这种方式来格式化它的每一部分就有点复杂了。

  • 因此,可以利用一个格式化字符串指出要被格式化的参数的索引。
    索引必须紧跟在%后面,而且必须以$结束。

例如:

import java.util.Date;  
public class DateDemo {
   
   public static void main(String args[]) {
   
       // 初始化 Date 对象
       Date date = new Date();
       // 使用toString()显示日期和时间
       System.out.printf("%1$s %2$tB %2$td, %2$tY","Due date:", date);
   }
}

以上实例编译运行结果如下:

Due date: February 09, 2014
  • 或者,你可以使用 < 标志。它表明先前被格式化的参数要被再次使用。例如:
    import java.util.Date;
    public class DateDemo {
         
     public static void main(String args[]) {
         
         // 初始化 Date 对象
         Date date = new Date();
         // 显示格式化时间
         System.out.printf("%s %tB %<te, %<tY","Due date:", date);
     }
    }
    
    以上实例编译运行结果如下:
    Due date: February 09, 2014
    
  • 定义日期格式的转换符可以使日期通过指定的转换符生成新字符串。
  • 这些日期转换符如下所示:
    ````java
    import java.util.*;
    public class DateDemo {
    public static void main(String args[]) {

     Date date=new Date();                                     
      //b的使用,月份简称 
      String str=String.format(Locale.US,"英文月份简称:%tb",date);      
      System.out.println(str);                                                                             
      System.out.printf("本地月份简称:%tb%n",date); 
    
      //B的使用,月份全称 
      str=String.format(Locale.US,"英文月份全称:%tB",date); 
      System.out.println(str); 
      System.out.printf("本地月份全称:%tB%n",date); 
    
      //a的使用,星期简称 
      str=String.format(Locale.US,"英文星期的简称:%ta",date); 
      System.out.println(str); 
    
      //A的使用,星期全称 
      System.out.printf("本地星期的简称:%tA%n",date); 
    
      //C的使用,年前两位 
      System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date); 
    
      //y的使用,年后两位 
      System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date); 
    
    //j的使用,一年的天数 
    System.out.printf("一年中的天数(即年的第几天):%tj%n",date); 

    //m的使用,月份 
    System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date); 

    //d的使用,日(二位,不够补零) 
    System.out.printf("两位数字的日(不足两位前面补0):%td%n",date); 

    //e的使用,日(一位不补零) 
    System.out.printf("月份的日(前面不补0):%te",date); 

}
}

输出结果为:
````bash
英文月份简称:May
本地月份简称:五月
英文月份全称:May
本地月份全称:五月
英文星期的简称:Thu
本地星期的简称:星期四
年的前两位数字(不足两位前面补0):20
年的后两位数字(不足两位前面补0):17
一年中的天数(即年的第几天):124
两位数字的月份(不足两位前面补0):05
两位数字的日(不足两位前面补0):04
月份的日(前面不补0):4

1.3 解析字符串为时间:

SimpleDateFormat 类有一些附加的方法。

  • 特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。例如:

示例:

import java.util.*;
import java.text.*;
public class DateDemo {
   
   public static void main(String args[]) {
   
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
      String input = "2015-11-11" ; 
      System.out.print(input + " Parses as "); 
      Date t; 
      try {
    
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) {
    
          System.out.println("Unparseable using " + ft); 
      }
   }
}

以上实例编译运行结果如下:

$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

1.4 Calendar类:

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢?

  • 比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类。

Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。

  • Calendar类是一个抽象类,在实际使用时实现特定的子类的对象;
    创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
  • 创建一个代表系统当前日期的Calendar对象
    Calendar c = Calendar.getInstance();//默认是当前日期

  • 创建一个指定日期的Calendar对象
    使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);

Calendar类对象字段类型

  • Calendar类中用以下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想
常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期
Calendar.HOUR 12小时制的小时
Calendar.HOUR_OF_DAY 24小时制的小时
Calendar.MINUTE 分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期几

1.5.1 Calendar类对象信息的设置:

Set设置,如:

  • Calendar c1 = Calendar.getInstance();

  • 调用:

    public final void set(int year,int month,int date)
    c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12
    

利用字段类型设置

  • 如果只设定某个字段,例如日期的值,则可以使用如下set方法:
    public void set(int field,int value)

把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算
c1.set(Calendar.DATE,10);

把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算
c1.set(Calendar.YEAR,2008);

其他字段属性set的意义以此类推

Add设置

Calendar c1 = Calendar.getInstance();

把c1对象的日期加上10,也就是c1也就表示为10天后的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, 10);

把c1对象的日期减去10,也就是c1也就表示为10天前的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, -10);

其他字段属性的add的意义以此类推

1.5 GregorianCalendar类:

  • Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
  • Calendar 的 getInstance() 方法
    • 返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。
    • GregorianCalendar定义了两个字段:AD和BC。这是代表公历定义的两个时代。

1.5.1 例子:

import java.util.*;
public class GregorianCalendarDemo {
   
   public static void main(String args[]) {
   
      String months[] = {
   
                          "Jan", "Feb", "Mar", "Apr",
                          "May", "Jun", "Jul", "Aug",
                          "Sep", "Oct", "Nov", "Dec"
                        };

      int year;
      // 初始化 Gregorian 日历
      // 使用当前时间和日期
      // 默认为本地时间和时区
      GregorianCalendar gcalendar = new GregorianCalendar();
      // 显示当前时间和日期的信息
      System.out.print("Date: ");
      System.out.print(months[gcalendar.get(Calendar.MONTH)]);
      System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
      System.out.println(year = gcalendar.get(Calendar.YEAR));
      System.out.print("Time: ");
      System.out.print(gcalendar.get(Calendar.HOUR) + ":");
      System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
      System.out.println(gcalendar.get(Calendar.SECOND));

      // 测试当前年份是否为闰年
      if(gcalendar.isLeapYear(year)) {
   
         System.out.println("当前年份是闰年");
      }
      else {
   
         System.out.println("当前年份不是闰年");
      }
   }
}

以上实例编译运行结果如下:

Date: Apr 22 2009
Time: 11:25:27
当前年份不是闰年

2. ❤️Java基础专栏 - 前篇回顾

3. 💕👉 其他好文推荐

目录
相关文章
|
1月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
81 4
|
1月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
138 5
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
127 1
|
1月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
186 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
144 1
|
安全 Java API
java 8 日期操作,真香
java 8 日期操作,真香
206 0
|
Java
JAVA 日期操作
1.用java.util.Calender来实现   Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.
858 0
|
Java 数据安全/隐私保护
java之正则表达式、日期操作
正则表达式和日期操作 正则表达式简介   正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求。   作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的 规则 .”和”\” “.”点儿,在正则表达式中表示任意一个字符。
3316 0
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案