📜  Java-日期和时间

📅  最后修改于: 2020-11-15 04:20:25             🧑  作者: Mango


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

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

Sr.No. Constructor & Description
1

Date( )

This constructor initializes the object with the current date and time.

2

Date(long millisec)

This constructor accepts an argument that equals the number of milliseconds that have elapsed since midnight, January 1, 1970.

以下是date类的方法。

Sr.No. Method & Description
1

boolean after(Date date)

Returns true if the invoking Date object contains a date that is later than the one specified by date, otherwise, it returns false.

2

boolean before(Date date)

Returns true if the invoking Date object contains a date that is earlier than the one specified by date, otherwise, it returns false.

3

Object clone( )

Duplicates the invoking Date object.

4

int compareTo(Date date)

Compares the value of the invoking object with that of date. Returns 0 if the values are equal. Returns a negative value if the invoking object is earlier than date. Returns a positive value if the invoking object is later than date.

5

int compareTo(Object obj)

Operates identically to compareTo(Date) if obj is of class Date. Otherwise, it throws a ClassCastException.

6

boolean equals(Object date)

Returns true if the invoking Date object contains the same time and date as the one specified by date, otherwise, it returns false.

7

long getTime( )

Returns the number of milliseconds that have elapsed since January 1, 1970.

8

int hashCode( )

Returns a hash code for the invoking object.

9

void setTime(long time)

Sets the time and date as specified by time, which represents an elapsed time in milliseconds from midnight, January 1, 1970.

10

String toString( )

Converts the invoking Date object into a string and returns the result.

获取当前日期和时间

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

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

简单的DateFormat格式代码

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

Character Description Example
G Era designator AD
y Year in four digits 2001
M Month in year July or 07
d Day in month 10
h Hour in A.M./P.M. (1~12) 12
H Hour in day (0~23) 22
m Minute in hour 30
s Second in minute 55
S Millisecond 234
E Day in week Tuesday
D Day in year 360
F Day of week in month 2 (second Wed. in July)
w Week in year 40
W Week in month 1
a A.M./P.M. marker PM
k Hour in day (1~24) 24
K Hour in A.M./P.M. (0~11) 10
z Time zone Eastern Standard Time
Escape for text Delimiter
Single quote `

使用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 %

这将产生以下结果-

输出

Due date: February 09, 2004

日期和时间转换字符

Character Description Example
c Complete date and time Mon May 04 09:51:52 CDT 2009
F ISO 8601 date 2004-02-09
D U.S. formatted date (month/day/year) 02/09/2004
T 24-hour time 18:05:19
r 12-hour time 06:05:19 pm
R 24-hour time, no seconds 18:05
Y Four-digit year (with leading zeroes) 2004
y Last two digits of the year (with leading zeroes) 04
C First two digits of the year (with leading zeroes) 20
B Full month name February
b Abbreviated month name Feb
m Two-digit month (with leading zeroes) 02
d Two-digit day (with leading zeroes) 03
e Two-digit day (without leading zeroes) 9
A Full weekday name Monday
a Abbreviated weekday name Mon
j Three-digit day of year (with leading zeroes) 069
H Two-digit hour (with leading zeroes), between 00 and 23 18
k Two-digit hour (without leading zeroes), between 0 and 23 18
I Two-digit hour (with leading zeroes), between 01 and 12 06
l Two-digit hour (without leading zeroes), between 1 and 12 6
M Two-digit minutes (with leading zeroes) 05
S Two-digit seconds (with leading zeroes) 19
L Three-digit milliseconds (with leading zeroes) 047
N Nine-digit nanoseconds (with leading zeroes) 047000000
P Uppercase morning or afternoon marker PM
p Lowercase morning or afternoon marker pm
z RFC 822 numeric offset from GMT -0800
Z Time zone PST
s Seconds since 1970-01-01 00:00:00 GMT 1078884319
Q Milliseconds since 1970-01-01 00:00:00 GMT 1078884319047

还有其他与日期和时间有关的有用的类。有关更多详细信息,您可以参考Java Standard文档。

将字符串解析为日期

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是Calendar类的具体实现,该类实现您熟悉的普通Gregorian日历。在本教程中我们没有讨论Calendar类,您可以为此查找标准Java文档。

Calendar的getInstance()方法返回一个GregorianCalendar,它使用默认的语言环境和时区中的当前日期和时间初始化。 GregorianCalendar定义两个字段:AD和BC。这代表了公历定义的两个时代。

GregorianCalendar对象也有几个构造函数-

Sr.No. Constructor & Description
1

GregorianCalendar()

Constructs a default GregorianCalendar using the current time in the default time zone with the default locale.

2

GregorianCalendar(int year, int month, int date)

Constructs a GregorianCalendar with the given date set in the default time zone with the default locale.

3

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

Constructs a GregorianCalendar with the given date and time set for the default time zone with the default locale.

4

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

Constructs a GregorianCalendar with the given date and time set for the default time zone with the default locale.

5

GregorianCalendar(Locale aLocale)

Constructs a GregorianCalendar based on the current time in the default time zone with the given locale.

6

GregorianCalendar(TimeZone zone)

Constructs a GregorianCalendar based on the current time in the given time zone with the default locale.

7

GregorianCalendar(TimeZone zone, Locale aLocale)

Constructs a GregorianCalendar based on the current time in the given time zone with the given locale.

这是GregorianCalendar类提供的一些有用的支持方法的列表-

Sr.No. Method & Description
1

void add(int field, int amount)

Adds the specified (signed) amount of time to the given time field, based on the calendar’s rules.

2

protected void computeFields()

Converts UTC as milliseconds to time field values.

3

protected void computeTime()

Overrides Calendar Converts time field values to UTC as milliseconds.

4

boolean equals(Object obj)

Compares this GregorianCalendar to an object reference.

5

int get(int field)

Gets the value for a given time field.

6

int getActualMaximum(int field)

Returns the maximum value that this field could have, given the current date.

7

int getActualMinimum(int field)

Returns the minimum value that this field could have, given the current date.

8

int getGreatestMinimum(int field)

Returns highest minimum value for the given field if varies.

9

Date getGregorianChange()

Gets the Gregorian Calendar change date.

10

int getLeastMaximum(int field)

Returns lowest maximum value for the given field if varies.

11

int getMaximum(int field)

Returns maximum value for the given field.

12

Date getTime()

Gets this Calendar’s current time.

13

long getTimeInMillis()

Gets this Calendar’s current time as a long.

14

TimeZone getTimeZone()

Gets the time zone.

15

int getMinimum(int field)

Returns minimum value for the given field.

16

int hashCode()

Overrides hashCode.

17

boolean isLeapYear(int year)

Determines if the given year is a leap year.

18

void roll(int field, boolean up)

Adds or subtracts (up/down) a single unit of time on the given time field without changing larger fields.

19

void set(int field, int value)

Sets the time field with the given value.

20

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

Sets the values for the fields year, month, and date.

21

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

Sets the values for the fields year, month, date, hour, and minute.

22

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

Sets the values for the fields year, month, date, hour, minute, and second.

23

void setGregorianChange(Date date)

Sets the GregorianCalendar change date.

24

void setTime(Date date)

Sets this Calendar’s current time with the given Date.

25

void setTimeInMillis(long millis)

Sets this Calendar’s current time from the given long value.

26

void setTimeZone(TimeZone value)

Sets the time zone with the given time zone value.

27

String toString()

Returns a string representation of this calendar.

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文档。