日期和时间(Date & Time)

优质
小牛编辑
129浏览
2023-12-01

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

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

Sr.No.构造函数和描述
1

Date( )

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

2

Date(long millisec)

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

以下是日期类的方法。

Sr.No.方法和描述
1

boolean after(Date date)

如果调用Date对象包含的日期晚于date指定的日期,则返回true,否则返回false。

2

boolean before(Date date)

如果调用Date对象包含的日期早于date指定的日期,则返回true,否则返回false。

3

Object clone( )

复制调用Date对象。

4

int compareTo(Date date)

将调用对象的值与date的值进行比较。 如果值相等则返回0。 如果调用对象早于date,则返回负值。 如果调用对象晚于date,则返回正值。

5

int compareTo(Object obj)

如果obj是Date类,则与compareTo(Date)操作相同。 否则,它会抛出ClassCastException。

6

boolean equals(Object date)

如果调用Date对象包含与date指定的时间和日期相同的时间和日期,则返回true,否则返回false。

7

long getTime( )

返回自1970年1月1日以来经过的毫秒数。

8

int hashCode( )

返回调用对象的哈希码。

9

void setTime(long time)

设置时间指定的时间和日期,表示从1970年1月1日午夜开始的经过时间(以毫秒为单位)。

10

String toString( )

将调用Date对象转换为字符串并返回结果。

获取当前日期和时间

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

例子 (Example)

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());
   }
}

这将产生以下结果 -

输出 (Output)

on May 04 09:51:52 CDT 2009

日期比较

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

  • 您可以使用getTime()来获取两个对象自1970年1月1日午夜以来经过的毫秒数,然后比较这两个值。

  • 您可以使用before(),after()和equals()之前的方法。 例如,因为该月的第12个月在18日之前,新日期(99,2,12)。之前(新日期(99,2,18))返回true。

  • 您可以使用compareTo()方法,该方法由Comparable接口定义并由Date实现。

使用SimpleDateFormat进行日期格式设置

SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。 SimpleDateFormat允许您从为日期时间格式选择任何用户定义的模式开始。

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

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

简单的DateFormat格式代码

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

字符描述
GEra designatorAD
yYear in four digits2001
MMonth in yearJuly or 07
dDay in month10
hHour in A.M./P.M. (1~12)12
HHour in day (0~23)22
m一小时一分钟30
s第二分钟55
SMillisecond234
EDay in weekTuesday
DDay in year360
F一个月中的某一天2(7月第二个周三)
wWeek in year40
WWeek in month1
aAM/PM标记PM
kHour in day (1~24)24
KHour in A.M./P.M. (0~11)10
z时区Eastern Standard Time
'Escape for textDelimiter
"单引号`

使用printf格式化日期

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

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

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

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

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

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

Due date: February 09, 2004

或者,您可以使用 它表示应该再次使用与前面的格式规范相同的参数。

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

Due date: February 09, 2004

日期和时间转换字符

字符描述
c完成日期和时间Mon May 04 09:51:52 CDT 2009
FISO 8601日期2004-02-09
D美国格式化日期(月/日/年)02/09/2004
T24-hour time18:05:19
r12-hour time06:05:19 pm
R24-hour time, no seconds18:05
Y四位数年份(带前导零)2004
y年度的最后两位数(带前导零)04
C年度前两位数(带前导零)20
B全月名称February
b缩写的月份名称Feb
m两位数月份(带前导零)02
d两位数的日(带前导零)03
e两位数的日期(没有前导零)9
A完整的工作日名称Monday
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大写早晨或下午标记PM
p小写早晨或下午标记pm
zGMT的RFC 822数字偏移量-0800
Z时区PST
s自1970-01-01 00:00:00 GMT以来的秒数1078884319
Q自格林威治标准时间1970-01-01 00:00:00以来的毫秒数1078884319047

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

将字符串解析为日期

SimpleDateFormat类有一些额外的方法,特别是parse(),它试图根据存储在给定SimpleDateFormat对象中的格式来解析字符串。

例子 (Example)

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

上述程序的样本运行将产生以下结果 -

输出 (Output)

1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818

睡了一会儿

您可以在从一毫秒到计算机生命周期的任何时间段内睡眠。 例如,以下程序将睡3秒钟 -

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

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

测量经过的时间

有时,您可能需要以毫秒为单位测量时间点。 那么让我们再次重写上面的例子 -

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

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对象还有几个构造函数 -

Sr.No.构造函数和描述
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类提供的一些有用的支持方法列表 -

Sr.No.方法和描述
1

void add(int field, int amount)

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

2

protected void computeFields()

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

3

protected void computeTime()

覆盖日历将时间字段值转换为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()

获取此Calendar的当前时间。

13

long getTimeInMillis()

获取此Calendar的当前时间为long。

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)

设置GregorianCalendar更改日期。

24

void setTime(Date date)

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

25

void setTimeInMillis(long millis)

从给定的long值设置此Calendar的当前时间。

26

void setTimeZone(TimeZone value)

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

27

String toString()

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

例子 (Example)

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

这将产生以下结果 -

输出 (Output)

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

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