首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java基础】全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类

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

作者头像
凉凉心.
发布2025-10-13 16:53:42
发布2025-10-13 16:53:42
3940
举报
文章被收录于专栏:CSDN专栏CSDN专栏

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 允许你选择任何用户自定义日期时间格式来运行。

例如:

代码语言:javascript
复制
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

"

单引号

例子:

代码语言:javascript
复制
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); 
  }
}

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

代码语言:javascript
复制
全部日期和时间信息:星期一 九月 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  

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

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

例如:

代码语言:javascript
复制
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);
   }
}

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

代码语言:javascript
复制
Due date: February 09, 2014
  • 或者,你可以使用 < 标志。它表明先前被格式化的参数要被再次使用。例如:
代码语言:javascript
复制
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);
   }
}

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

代码语言:javascript
复制
Due date: February 09, 2014
  • 定义日期格式的转换符可以使日期通过指定的转换符生成新字符串。
  • 这些日期转换符如下所示:
代码语言:javascript
复制
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); 
   }
}

输出结果为:

代码语言:javascript
复制
英文月份简称:May
本地月份简称:五月
英文月份全称:May
本地月份全称:五月
英文星期的简称:Thu
本地星期的简称:星期四
年的前两位数字(不足两位前面补0):20
年的后两位数字(不足两位前面补0):17
一年中的天数(即年的第几天):124
两位数字的月份(不足两位前面补0):05
两位数字的日(不足两位前面补0):04
月份的日(前面不补0):4

1.3 解析字符串为时间:

SimpleDateFormat 类有一些附加的方法。

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

示例:

代码语言:javascript
复制
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); 
      }
   }
}

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

代码语言:javascript
复制
$ 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的对象,然后再设定该对象中的年月日参数来完成。
代码语言:javascript
复制
//创建一个代表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();
  • 调用:
代码语言:javascript
复制
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设置

代码语言:javascript
复制
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 例子:
代码语言:javascript
复制
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("当前年份不是闰年");
      }
   }
}

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

代码语言:javascript
复制
Date: Apr 22 2009
Time: 11:25:27
当前年份不是闰年

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Java 日期时间:
    • 1.1 日期比较:
    • 1.2 日期和时间的格式化编码:
    • 1.3 解析字符串为时间:
    • 1.4 Calendar类:
      • 1.5.1 Calendar类对象信息的设置:
    • 1.5 GregorianCalendar类:
      • 1.5.1 例子:
  • 2. ❤️Java基础专栏 - 前篇回顾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档