Java - 日期和时间

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

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

Sr.No. 构造函数&说明
1

Date()

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

2

日期(长毫米)

此构造函数接受的参数等于自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与compareTo(Date)操作相同属于Date类.否则,它会抛出ClassCastException.

6

布尔等于(对象日期)

如果调用Date对象包含的时间和日期与一个由date指定,否则返回false.

7

long getTime()

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

8

int hashCode()

返回调用对象的哈希码.

9

void setTime(long tim)

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

10

String toString()

Conv erts将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日午夜以来经过的毫秒数,然后比较这两个值.

  • 您可以使用之前的方法(),after()和equals().例如,因为当月12日在18日之前,新日期(99,2,12).之前(新日期(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字母都保留为模式字母,其定义为以下 :

字符 描述 示例
G Era指示符 AD
y 四位数的年份 2001
M 一年中的月份 七月或七月
d 日期 10
h 上午/下午的小时(1~12) 12
H 一天中的小时(0~23) 22
m 小时分钟 30
s 分秒钟 55
S 毫秒 234
E 星期几 星期二
D 日复一日 360
F 每月的某一天 2(7月的第二个星期三)
w 一年中的一周 40
W 每月一周 1
a AM/PM标记 PM
k 一天中的小时(1~24) 24
K 上午/下午的小时(0~11) 10
z 时区 东部标准时间
' Escape for text Delimiter
" 单引号 `

使用printf格式化日期

使用 printf 方法可以非常轻松地完成日期和时间格式化.使用双字母格式,以

示例

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

这将产生以下结果 :

输出

 
截止日期:2004年2月9日

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

示例

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

日期和时间转换字符

Character 描述 示例
c 完成日期和时间 Mon May 04 09:51:52 CDT 2009
F ISO 8601日期 2004-02-09
D 美国格式化日期(月/日/年) 02/09/2004
T 24小时时间 18:05:19
r 12小时时间 06:05:19 pm
R 24小时时间,无秒数 18: 05
Y 四位数年份(带前导零) 2004
y 年份的最后两位数(带前导零) 04
C 年份的前两位数(带前导零) 20
B 完整月份名称 2月
b 缩写的月份名称 2月
m 两位数月份(带前导零) 02
d 两位数日(带前导零) 03
e 两位数日(不含前导零) 9
A 完整工作日名称 星期一
a 缩写的工作日名称 Mon
j 一年中的三位数日(带前导零) 069
H 两位数小时(前导零),介于00和23之间 18
k 两位数小时(没有前导零),0到23之间 18
两位数小时(前导零),介于01和12之间 06
l 两位数小时(无前导零,1到12之间 6
M 两位数分钟(带前导零) 05
S 两位数秒(带前导零) 19
L 三位数毫秒(带前导零) 047
N 九位数纳秒(带前导零) 047000000
P 大写上午或下午标记 PM
p 小写早上或下午标记 pm
z GMT的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对象还有几个构造函数 :

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./p>

7

GregorianCalendar(TimeZone区域,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

日期getGregorianChange()

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

10

int getLeastMaximum(int field)

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

11

int getMaximum(int field)

返回s给定字段的最大值.

12

日期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)

设置字段年,月,日,小时,分钟,a的值第二个.

23

void setGregorianChange(Date date)

设置GregorianCalendar更改日期.

24

void setTime(Date date)

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

25

void setTimeInMillis(long millis)

从给定的长值设置此日历的当前时间.

26

void setTimeZone(TimeZone value)

使用给定时间设置时区区域值.

27

字符串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文档.