java.util 包供给了 Date 类来封装当时的日期和时刻。 Date 类供给两个结构函数来实例化 Date 目标。

第一个结构函数运用当时日期和时刻来初始化目标

Date( )

第二个结构函数接纳一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数

Date(long millisec)

Date 目标创立今后,可以调用下面的办法:

序号 办法描绘
1 boolean after(Date date),若当调用此办法的Date目标在指定日期之后回来true,不然回来false
2 boolean before(Date date),若当调用此办法的Date目标在指定日期之前回来true,不然回来false
3 Object clone( ),回来此目标的副本
4 int compareTo(Date date),比较当调用此办法的Date目标和指定日期。两者持平时候回来0。调用目标在指定日期之前则回来负数。调用目标在指定日期之后则回来正数
5 int compareTo(Object obj),若obj是Date类型则操作等同于compareTo(Date) 。不然它抛出ClassCastException
6 boolean equals(Object date),当调用此办法的Date目标和指定日期持平时候回来true,不然回来false
7 long getTime( ),回来自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 目标表明的毫秒数
8 int hashCode( ),回来此目标的哈希码值
9 void setTime(long time),用自1970年1月1日00:00:00 GMT今后time毫秒数设置时刻和日期
10 String toString( ),把此 Date 目标转化为以下办法的 String: dow mon dd hh:mm:ss zzz yyyy 其间: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

例如获取当时日期时刻并打印

import java.util.Date;
public class DateDemo {
   public static void main(String[] args) {
       // 初始化 Date 目标
       Date date = new Date();
       // 运用 toString() 函数显现日期时刻
       System.out.println(date.toString());
   }
}
// 实例编译运转成果如下:
// Tue Apr 04 22:50:40 CST 2023

日期比较

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 ("yyyy-MM-dd hh:mm:ss");
      System.out.println("当时时刻为: " + ft.format(dNow));
   }
}
// 实例编译运转成果如下:
// 当时时刻为: 2023-04-04 10:55:24

SimpleDateFormat ft = new SimpleDateFormat (“yyyy-MM-dd hh:mm:ss”); 这一行代码确立了转化的格局,其间 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。留意:有的格局大写,有的格局小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制。

日期和时刻的格局化编码

时刻形式字符串用来指定时刻格局。在此形式中,一切的 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
单引号 `

运用printf格局化日期

printf 办法可以很轻松地格局化时刻和日期。运用两个字母格局,它以 %t 最初并且以下面表格中的一个字母结尾。

  • %tY:输出四位数的年份,例如:2023
  • %ty:输出两位数的年份,例如:23
  • %tm:输出两位数的月份,例如:02
  • %tB:输出月份的全名,例如:February
  • %tb:输出月份的缩写,例如:Feb
  • %tA:输出星期的全名,例如:Wednesday
  • %ta:输出星期的缩写,例如:Wed
  • %td:输出两位数的日期,例如:24
  • %te:输出一位或两位数的日期,例如:24 或 02
  • %tH:输出24小时制的小时数,例如:23
  • %tI:输出12小时制的小时数,例如:11
  • %tM:输出分钟数,例如:45
  • %tS:输出秒数,例如:30
  • %tp:输出上午还是下午,例如:AM 或 PM
  • %tZ:输出时区,例如:GMT+08:00
转化符 说明 示例
%tc 包括全部日期和时刻信息 星期六 十月 27 14:21:20 CST 2007
%tF “年-月-日”格局 2007-10-27
%tD “月/日/年”格局 10/27/07
%tr “HH:MM:SS PM”格局(12时制) 02:25:51 下午
%tT “HH:MM:SS”格局(24时制) 14:28:16
%tR “HH:MM”格局(24时制) 14:28

printf格局化日期实例

格局化日期:

import java.util.Date;
public class DateFormatExample {
   public static void main(String[] args) {
      Date date = new Date();
        System.out.printf("%tY-%tm-%td %tH:%tM:%tS %tZ", date, date, date, date, date, date, date);
   }
}
// 履行输出成果为:
// 2023-04-05 09:59:23 CST

运用转化符格局化日期:

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);  
  }
}
// 实例编译运转成果如下:
// 全部日期和时刻信息:星期三 四月 05 10:06:21 CST 2023
// 年-月-日格局:2023-04-05
// 月/日/年格局:04/05/23
// HH:MM:SS PM格局(12时制):10:06:21 上午
// HH:MM:SS格局(24时制):10:06:21
// HH:MM格局(24时制):10:06

假如你需要重复供给日期,那么运用这种办法来格局化它的每一部分就有点杂乱了。因而,可以运用一个格局化字符串指出要被格局化的参数的索引。索引有必要紧跟在 % 后面,而且有必要以 $ 结束。例如:

import java.util.Date;
public class DateDemo {
   public static void main(String[] args) {
       // 初始化 Date 目标
       Date date = new Date();
       // 运用toString()显现日期和时刻
       // %1$索引指向 "Due date:"
       // %2$索引指向 date
       System.out.printf("%1$s %2$tB %2$td, %2$tY", 
                         "Due date:", date);
   }
}
// 实例编译运转成果如下:
// Due date: 四月 05, 2023

或许,你可以运用 < 标志。它表明先前被格局化的参数要被再次运用。例如:

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: 四月 5, 2023

界说日期格局的转化符可以使日期通过指定的转化符生成新字符串。这些日期转化符如下所示:

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);  
   }
}
// 输出成果为:
// 英文月份简称:Apr
// 本地月份简称:四月
// 英文月份全称:April
// 本地月份全称:四月
// 英文星期的简称:Wed
// 本地星期的简称:星期三
// 年的前两位数字(缺乏两位前面补0):20
// 年的后两位数字(缺乏两位前面补0):23
// 一年中的天数(即年的第几天):095
// 两位数字的月份(缺乏两位前面补0):04
// 两位数字的日(缺乏两位前面补0):05
// 月份的日(前面不补0):5

解析字符串为时刻

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 = args.length == 0 ? "1818-11-11" : args[0]; 
      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); 
      }
   }
}
// 实例编译运转成果如下:
// 1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818

休眠(sleep)

sleep()使当时线程进入停滞状况(堵塞当时线程),让出CPU的运用、目的是不让当时线程独自霸占该进程所获的CPU资源,以留一定时刻给其他线程履行的机会。你可以让程序休眠一毫秒的时刻或许到您的核算机的寿命长的恣意段时刻。例如,下面的程序会休眠3秒:

import java.util.*;
public class SleepDemo {
   public static void main(String[] args) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(1000*3);   // 休眠3秒
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) { 
          System.out.println("Got an exception!"); 
      }
   }
}
// 实例编译运转成果如下:
// Thu Apr 06 11:18:56 CST 2023
// Thu Apr 06 11:18:59 CST 2023

丈量时刻距离(以毫秒为单位)的实例:\color{red}{丈量时刻距离(以毫秒为单位)的实例 :}

import java.util.*;
public class DiffDemo {
   public static void main(String[] args) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}
// 实例编译运转成果如下:
// Thu Apr 06 11:25:14 CST 2023
// Thu Apr 06 11:25:17 CST 2023
// Difference is : 3038

Calendar类

咱们现在已经可以格局化并创立一个日期目标了,可是咱们怎么才干设置和获取日期数据的特定部分呢,比如说小时,日,或许分钟? 咱们又怎么在日期的这些部分加上或许减去值呢? 答案是运用Calendar 类。

Calendar类的功用要比Date类强大许多,但在完成办法上也比Date类要杂乱一些。

Calendar类是一个抽象类,在实际运用时完成特定的子类的目标,创立目标的过程对程序员来说是通明的,只需要运用getInstance办法创立即可。例如创立一个代表系统当时日期的Calendar目标:

Calendar c = Calendar.getInstance();//默许是当时日期

或许创立一个指定日期的Calendar目标(注:Calendar 的月份是从 0 开端的):

//创立一个代表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 星期几

Calendar类目标信息的设置

set设置

调用 public final void set(int year,int month,int date) 办法。例如:

Calendar c1 = Calendar.getInstance();
c1.set(2009, 6, 12);//把Calendar目标c1的年月日别离设这为:2009、6、12

假如只设定某个字段,例如日期的值,则可以运用 public void set(int field,int value) 办法。例如,把 c1目标代表的日期设置为10号,其他的一切数值会被从头核算:

Calendar c1 = Calendar.getInstance();
c1.set(Calendar.DATE,10);

其他字段特点set的含义以此类推。

add设置

把c1目标的日期加上10,也便是c1也就表明为10天后的日期,其它一切的数值会被从头核算:

Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DATE, 10);

把c1目标的日期减去10,也便是c1也就表明为10天前的日期,其它一切的数值会被从头核算:

Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DATE, -10);

其他字段特点的add的含义以此类推。

Calendar类目标信息的取得

Calendar c1 = Calendar.getInstance();
// 取得年份
int year = c1.get(Calendar.YEAR);
// 取得月份
int month = c1.get(Calendar.MONTH) + 1;
// 取得日期
int date = c1.get(Calendar.DATE);
// 取得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 取得分钟
int minute = c1.get(Calendar.MINUTE);
// 取得秒
int second = c1.get(Calendar.SECOND);
// 取得星期几(留意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

GregorianCalendar类

Calendar类完成了公历日历,GregorianCalendar是Calendar类的一个具体完成。Calendar 的getInstance()办法回来一个默许用当时的言语环境和时区初始化的GregorianCalendar目标。GregorianCalendar界说了两个字段:AD和BC。这是代表公历界说的两个时代。

下面列出GregorianCalendar目标的几个结构办法

  • GregorianCalendar() —— 在具有默许言语环境的默许时区内运用当时时刻结构一个默许的 GregorianCalendar。
  • GregorianCalendar(int year, int month, int date) —— 在具有默许言语环境的默许时区内结构一个带有给定日期设置的 GregorianCalendar。
  • GregorianCalendar(int year, int month, int date, int hour, int minute) —— 为具有默许言语环境的默许时区结构一个具有给定日期和时刻设置的 GregorianCalendar。
  • GregorianCalendar(int year, int month, int date, int hour, int minute, int second) —— 为具有默许言语环境的默许时区结构一个具有给定日期和时刻设置的 GregorianCalendar。
  • GregorianCalendar(Locale aLocale) —— 在具有给定言语环境的默许时区内结构一个依据当时时刻的 GregorianCalendar。
  • GregorianCalendar(TimeZone zone) —— 在具有默许言语环境的给定时区内结构一个依据当时时刻的 GregorianCalendar。
  • GregorianCalendar(TimeZone zone, Locale aLocale) —— 在具有给定言语环境的给定时区内结构一个依据当时时刻的 GregorianCalendar。

这里是GregorianCalendar 类供给的一些尝用的办法列表

  • void add(int field, int amount) —— 依据日历规矩,将指定的(有符号的)时刻量增加到给定的日历字段中。
  • protected void computeFields() —— 转化UTC毫秒值为时刻域值。
  • protected void computeTime() —— 覆盖Calendar ,转化时刻域值为UTC毫秒值。
  • boolean equals(Object obj) —— 比较此 GregorianCalendar 与指定的 Object。
  • int get(int field) —— 获取指定字段的时刻值。
  • int getActualMaximum(int field) —— 回来当时日期,给定字段的最大值。
  • int getActualMinimum(int field) —— 回来当时日期,给定字段的最小值。
  • int getGreatestMinimum(int field) —— 回来此 GregorianCalendar 实例给定日历字段的最高的最小值。
  • Date getGregorianChange() —— 取得格里高利历的更改日期。
  • int getLeastMaximum(int field) —— 回来此 GregorianCalendar 实例给定日历字段的最低的最大值。
  • int getMaximum(int field) —— 回来此 GregorianCalendar 实例的给定日历字段的最大值。
  • Date getTime() —— 获取日历当时时刻。
  • long getTimeInMillis() —— 获取用长整型表明的日历的当时时刻。
  • TimeZone getTimeZone() —— 获取时区。
  • int getMinimum(int field) —— 回来给定字段的最小值。
  • int hashCode() —— 重写hashCode。
  • boolean isLeapYear(int year) —— 确定给定的年份是否为闰年。
  • void roll(int field, boolean up) —— 在给定的时刻字段上增加或减去(上/下)单个时刻单元,不更改更大的字段。
  • void set(int field, int value) —— 用给定的值设置时刻字段。
  • void set(int year, int month, int date) —— 设置年、月、日的值。
  • void set(int year, int month, int date, int hour, int minute) —— 设置年、月、日、小时、分钟的值。
  • void set(int year, int month, int date, int hour, int minute, int second) —— 设置年、月、日、小时、分钟、秒的值。
  • void setGregorianChange(Date date) —— 设置 GregorianCalendar 的更改日期。
  • void setTime(Date date) —— 用给定的日期设置Calendar的当时时刻。
  • void setTimeInMillis(long millis) —— 用给定的long型毫秒数设置Calendar的当时时刻。
  • void setTimeZone(TimeZone value) —— 用给定时区值设置当时时区。
  • String toString() —— 回来代表日历的字符串。

GregorianCalendar 运用实例

mport 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 6 2023
// Time: 3:35:13
// 当时年份不是闰年

办法实例:\color{red}{办法实例:}

时刻戳转化成时刻

public class Test {
    public static void main(String args[]) {
        // 获取当时时刻戳
        Long timeStamp = System.currentTimeMillis();
        // 时刻格局
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 时刻戳转化成时刻
        String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
        System.out.println("格局化成果:" + sd);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒");
        String sd2 = sdf2.format(new Date(Long.parseLong(String.valueOf(timeStamp))));
        System.out.println("格局化成果:" + sd2);
    }
}
// 实例编译运转成果如下:
// 格局化成果:2023-04-23 14:24:13
// 格局化成果:2023 年 04 月 23 日 14 时 24 分 13 秒