Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java APIs 和框架

Java 类引用

Java 有用资源

Java - 日期和时间



Java 提供了可在 java.util 中使用的 Date,此类封装了当前日期和时间。

Date 类支持如下表所示的两个构造函数。

序号 构造函数和描述
1

Date( )

此构造函数使用当前日期和时间初始化对象。

2

Date(long millisec)

此构造函数接受一个参数,该参数等于自 1970 年 1 月 1 日午夜以来的毫秒数。

以下是 Date 类的其他方法。

序号 方法和描述
1 boolean after(Date when)

此方法测试此日期是否在指定日期之后。

2 boolean before(Date when)

此方法测试此日期是否在指定日期之前。

3 Object clone()

此方法返回此对象的副本。

4 int compareTo(Date anotherDate)

此方法比较两个 Date 的顺序。

5 boolean equals(Object obj)

此方法比较两个日期是否相等。

6 static Date from​(Instant instant)

此方法从 Instant 对象获取 Date 实例。

7 long getTime()

此方法返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数,由此 Date 对象表示。

8 int hashCode()

此方法返回此对象的哈希码值。

9 void setTime(long time)

此方法设置此 Date 对象以表示自 1970 年 1 月 1 日 00:00:00 GMT 以来 time 毫秒的时刻。

10 Instant toInstant()

此方法将此 Date 对象转换为 Instant。

11 String toString()

此方法将此 Date 对象转换为以下形式的字符串。

获取当前日期和时间

这是一种在 Java 中获取当前日期和时间非常简单的方法。可以使用带有 toString() 方法的简单 Date 对象来打印当前日期和时间,如下所示:

示例

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date using toString()
      System.out.println(date.toString());
   }
}

这将产生以下结果:

输出

on May 04 09:51:52 CDT 2009

日期比较

以下是比较两个日期的三种方法:

  • 可以使用 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));
   }
}

这将产生以下结果:

输出

Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

SimpleDateFormat 格式代码

要指定时间格式,请使用时间模式字符串。在此模式中,所有 ASCII 字母都保留为模式字母,定义如下:

字符 描述 示例
G 纪元指示符 公元
y 四位数年份 2001
M 月份 七月或 07
d 10
h 小时 (1~12) 12
H 小时 (0~23) 22
m 分钟 30
s 55
S 毫秒 234
E 星期几 星期二
D 一年中的第几天 360
F 一个月中的星期几 2 (七月的第二个星期三)
w 一年中的第几周 40
W 一个月中的第几周 1
a 上午/下午标记 下午
k 小时 (1~24) 24
K 小时 (0~11) 10
z 时区 东部标准时间
' 转义文本 分隔符
" 单引号 `

使用 printf 进行日期格式化

可以使用 printf 方法非常轻松地进行日期和时间格式化。可以使用以 t 开头并以表格中的一个字母结尾的两个字母格式,如下面的代码所示。

示例

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date
      String str = String.format("Current Date/Time : %tc", date );

      System.out.printf(str);
   }
}

这将产生以下结果:

输出

Current Date/Time : Sat Dec 15 16:37:57 MST 2012

如果必须多次提供日期来格式化每个部分,那就有点愚蠢了。因此,格式字符串可以指示要格式化的参数的索引。

索引必须紧跟在 % 之后,并且必须以 $ 结尾。

示例

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display time and date
      System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
   }
}

这将产生以下结果:

输出

Due date: February 09, 2004

或者,可以使用 < 标志。它指示应再次使用与前面格式规范相同的参数。

示例

import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display formatted date
      System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
   }
}

这将产生以下结果:

输出

Due date: February 09, 2004

日期和时间转换字符

字符 描述 示例
c 完整的日期和时间 2009年5月4日星期一 09:51:52 CDT
F ISO 8601 日期格式 2004-02-09
D 美国日期格式 (月/日/年) 02/09/2004
T 24小时制时间 18:05:19
r 12小时制时间 下午06:05:19
R 24小时制时间,无秒 18:05
Y 四位数年份(带前导零) 2004
y 年份的后两位数(带前导零) 04
C 年份的前两位数(带前导零) 20
B 月份全称 二月
b 月份缩写 Feb
m 两位数月份(带前导零) 02
d 两位数日期(带前导零) 03
e 两位数日期(无前导零) 9
A 星期几全称 星期一
a 星期几缩写 Mon
j 三位数一年中的第几天(带前导零) 069
H 两位数小时(带前导零),介于00和23之间 18
k 两位数小时(无前导零),介于0和23之间 18
I 两位数小时(带前导零),介于01和12之间 06
l 两位数小时(无前导零),介于1和12之间 6
M 两位数分钟(带前导零) 05
S 两位数秒(带前导零) 19
L 三位数毫秒(带前导零) 047
N 九位数纳秒(带前导零) 047000000
P 上午或下午标记(大写) 下午
p 上午或下午标记(小写) pm
z RFC 822 格林尼治标准时间数值偏移 -0800
Z 时区 PST
s 自1970-01-01 00:00:00 GMT以来的秒数 1078884319
Q 自1970-01-01 00:00:00 GMT以来的毫秒数 1078884319047

还有其他与日期和时间相关的有用类。更多详情,请参考Java标准文档。

将字符串解析为日期

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 EST 1818

暂停一段时间

您可以暂停从一毫秒到计算机寿命的任何时间段。例如,以下程序将暂停3秒:

示例

import java.util.*;
public class SleepDemo {

   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) {
         System.out.println("Got an exception!"); 
      }
   }
}

这将产生以下结果:

输出

Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009

测量经过时间

有时,您可能需要以毫秒为单位测量某个时间点。因此,让我们再次改写上面的示例:

示例

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!");
      }
   }
}

这将产生以下结果:

输出

Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:57 GMT 2009
Difference is : 5993

GregorianCalendar 类

GregorianCalendar 是 Calendar 类的具体实现,它实现了您熟悉的普通格里高利历。本教程中未讨论 Calendar 类,您可以查找标准 Java 文档。

Calendar 的 getInstance() 方法返回一个 GregorianCalendar,它使用默认区域设置和时区中的当前日期和时间进行初始化。GregorianCalendar 定义了两个字段:AD 和 BC。它们代表格里高利历定义的两个纪元。

GregorianCalendar 对象还有几个构造函数:

序号 构造函数和描述
1

GregorianCalendar()

使用默认时区和默认区域设置中的当前时间构造默认的 GregorianCalendar。

2

GregorianCalendar(int year, int month, int date)

使用默认时区和默认区域设置中设置的给定日期构造 GregorianCalendar。

3

GregorianCalendar(int year, int month, int date, int hour, int minute)

使用为默认时区和默认区域设置设置的给定日期和时间构造 GregorianCalendar。

4

GregorianCalendar(int year, int month, int date, int hour, int minute, int second)

使用为默认时区和默认区域设置设置的给定日期和时间构造 GregorianCalendar。

5

GregorianCalendar(Locale aLocale)

基于默认时区和给定区域设置中的当前时间构造 GregorianCalendar。

6

GregorianCalendar(TimeZone zone)

基于给定时区和默认区域设置中的当前时间构造 GregorianCalendar。

7

GregorianCalendar(TimeZone zone, Locale aLocale)

基于给定时区和给定区域设置中的当前时间构造 GregorianCalendar。

以下是 GregorianCalendar 类提供的一些有用的支持方法列表:

序号 方法和描述
1

void add(int field, int amount)

根据日历的规则,将指定(带符号)的时间量添加到给定的时间字段。

2

protected void computeFields()

将 UTC 作为毫秒转换为时间字段值。

3

protected void computeTime()

覆盖 Calendar 将时间字段值转换为 UTC 作为毫秒。

4

boolean equals(Object obj)

比较此 GregorianCalendar 与对象引用。

5

int get(int field)

获取给定时间字段的值。

6

int getActualMaximum(int field)

返回给定当前日期时此字段可能具有的最大值。

7

int getActualMinimum(int field)

返回给定当前日期时此字段可能具有的最小值。

8

int getGreatestMinimum(int field)

如果变化,则返回给定字段的最高最小值。

9

Date getGregorianChange()

获取格里高利历更改日期。

10

int getLeastMaximum(int field)

如果变化,则返回给定字段的最低最大值。

11

int getMaximum(int field)

返回给定字段的最大值。

12

Date getTime()

获取此日历的当前时间。

13

long getTimeInMillis()

获取此日历的当前时间(长整型)。

14

TimeZone getTimeZone()

获取时区。

15

int getMinimum(int field)

返回给定字段的最小值。

16

int hashCode()

覆盖 hashCode。

17

boolean isLeapYear(int year)

确定给定年份是否为闰年。

18

void roll(int field, boolean up)

在给定的时间字段上添加或减去(上/下)一个时间单位,而不会更改较大的字段。

19

void set(int field, int value)

使用给定值设置时间字段。

20

void set(int year, int month, int date)

设置年份、月份和日期字段的值。

21

void set(int year, int month, int date, int hour, int minute)

设置年份、月份、日期、小时和分钟字段的值。

22

void set(int year, int month, int date, int hour, int minute, int second)

设置年份、月份、日期、小时、分钟和秒字段的值。

23

void setGregorianChange(Date date)

设置格里高利历更改日期。

24

void setTime(Date date)

使用给定的日期设置此日历的当前时间。

25

void setTimeInMillis(long millis)

使用给定的长整型值设置此日历的当前时间。

26

void setTimeZone(TimeZone value)

使用给定的时区值设置时区。

27

String toString()

返回此日历的字符串表示形式。

示例

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;
      // Create a Gregorian calendar initialized
      // with the current date and time in the
      // default locale and timezone.
      
      GregorianCalendar gcalendar = new GregorianCalendar();
      
      // Display current time and date information.
      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));

      // Test if the current year is a leap year
      if(gcalendar.isLeapYear(year)) {
         System.out.println("The current year is a leap year");
      }else {
         System.out.println("The current year is not a leap year");
      }
   }
}

这将产生以下结果:

输出

Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year

有关 Calendar 类中可用常量的完整列表,请参阅标准 Java 文档。

广告