日期和时间(Date & Time)
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字母都保留为模式字母,其定义如下 -
字符 | 描述 | 例 |
---|---|---|
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 | 一小时一分钟 | 30 |
s | 第二分钟 | 55 |
S | Millisecond | 234 |
E | Day in week | Tuesday |
D | Day in year | 360 |
F | 一个月中的某一天 | 2(7月第二个周三) |
w | Week in year | 40 |
W | Week in month | 1 |
a | AM/PM标记 | PM |
k | Hour in day (1~24) | 24 |
K | Hour in A.M./P.M. (0~11) | 10 |
z | 时区 | Eastern Standard Time |
' | Escape for text | Delimiter |
" | 单引号 | ` |
使用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 |
F | ISO 8601日期 | 2004-02-09 |
D | 美国格式化日期(月/日/年) | 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 | 四位数年份(带前导零) | 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 |
z | GMT的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文档。