Java在java.util包中提供了Date类,其封装了当前日期和时间。
Date类包含了下面两种构造器:
序号 | 构造器 & 描述 |
---|---|
1 | Date() 这个构造器将对象初始化为当前日期和时间。 |
2 | Date(long millisec) 这个构造器有一个传入参数,这个参数是从1970年2月1日之后的毫秒数。 |
下表中列出了Date类中定义的方法:
序号 | 方法及其描述 |
---|---|
1 | boolean after(Date date) 当前日期在指定日期后面时返回true,否则返回false。 |
2 | boolean before(Date date) 当前日期在指定日期前面时返回true,否则返回false。 |
3 | Object clone( ) 复制日期对象。 |
4 | int compareTo(Date date) 将两个日期进行比较。若当前日期与指定日期相同,则返回0;若当前日期在指定日期后面,则返回负数;若当前日期在指定日期前面,则返回正数。 |
5 | int compareTo(Object obj) 当obj是Date类型对象时,功能和conpareTo(Date date)方法相同;否则返回ClassCastException异常。 |
6 | boolean equals(Object date) 当前日期和指定日期的日期和时间都相同时返回true,否则返回false。 |
7 | long getTime( ) 返回从1970年1月1日到当前日期经过的毫秒数。 |
8 | int hashCode( ) 返回日期对象的哈希值。 |
9 | void setTime(long time) 设置日期时间,传入值为日期距离1970年1月1日经过的毫秒数。 |
10 | String toString( ) 将日期对象转换为字符串返回。 |
下面代码中写的是Java中获取日期和时间的一种非常简单的方法。使用的是一个简单的Date对象然后用toString()方法来打印当前日期和时间。
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
//初始化Date对象
Date date = new Date();
//以字符串形式输出日期
System.out.println(date.toString());
}
}
程序输出如下:
on May 04 09:51:52 CDT 2009
下面是比较两个日期对象的方法:
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
要想指定日期时间的格式,需要用到日期模式字符串。在这个模式里面,所有用到的ASCII编码字符都被保留为模式字符,也就是下面这些:
字符 | 说明 | 举例 |
---|---|---|
G | 描述时代 | AD |
y | 年 | 2001 |
M | 月 | July 或 07 |
d | 日 | 10 |
h | 时(1-12) | 12 |
H | 时(0-23) | 22 |
m | 分 | 30 |
s | 秒 | 55 |
S | 毫秒 | 234 |
E | 星期 | Tuesday |
D | 一年中的第几天 | 360 |
F | 一个月中的第n个星期几 | 2(7月的第2个星期三) |
w | 一年中的第几个星期 | 40 |
W | 一个月中的第几个星期 | 1 |
a | A.M./P.M.的标识 | PM |
k | 一天中的第几个小时(1-24) | 24 |
K | AM或PM计时下的第几个小时(0-11) | 10 |
z | 时区 | Eastern Standard Time |
日期时间的格式化可以非常简单地使用printf()方法。我们可以用两个字符来表示格式,起始字符为t,后面的字符为后面一节中列出的编码。
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
//初始化Date对象
Date date = new 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[]) {
//初始化日期对象
Date date = new 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[]) {
//初始化日期对象
Date date = new Date();
//输出格式化的日期
System.out.printf("%s %tB %, "Due date:", date);
}
}
程序输出:
Due date: February 09, 2004
字符 | 说明 | 举例 |
---|---|---|
c | 完整的日期和时间 | Mon May 04 09:51:52 CDT 2009 |
F | ISO 8601日期 | 2005-01-02 |
D | 美国日期格式(月/日/年) | 03/30/2020 |
T | 24小时制时间 | 20:03:35 |
r | 12小时制时间 | 07:02:42 pm |
R | 24小时制时间,不包含秒数 | 20:03 |
Y | 4位数的年份 | 2019 |
y | 年份的后2位 | 19 |
C | 年份的前2位 | 20 |
B | 完整的月份名 | February |
b | 月份的简写 | Feb |
m | 月份的2位数表示 | 01 |
d | 日期的2位数表示 | 09 |
e | 日期的2位数表示(不展示开头的0) | 9 |
A | 完整的星期几 | Monday |
a | 星期几的缩写 | Mon |
Z | 时区 | PST |
s | 从1970-01-01 00:00:00后的秒数 | 1451254834 |
Q | 从1970-01-01 00:00:00后的毫秒数 | 14512548345842 |
提示:除了上面提到的类和方法之外,还有其他有用的处理日期和时间的类,具体可以参考Java开发标准文档。
SimpleDateFormat类还有一些其它的方法,尤其是parse(),可以根据指定的格式来将字符串转换为日期类型。
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
我们可以让程序暂停从1毫秒到任意长的时间。例如下面的程序中指定了暂停执行时间为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 June 03 18:04:41 GMT 2020
Sun June 03 18:04:54 GMT 2020
有时候我们需要测量程序运行了多少毫秒,可以把上面的代码修改一下:
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 June 03 18:16:51 GMT 2020
Sun June 03 18:16:57 GMT 2020
Difference is : 5860
GregorianCalendar是Calendar类的具体实现类,该类实现了我们熟悉的公历日历。我们这篇教程中不讨论Calendar类,可以查看Java标准开发文档来学习。
Calendar中声明的getInstance()类返回了GregorianCalendar初始化对象,其初始化的值是主机上的本地时区的日期和时间。GregorianCalendar类定义了两个时间区域:公元前和公元后。这两个时间区域在公历日历中表示两个区域。
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;
//使用当前日期和默认时区创建一个公历日期
GregorianCalendar gcalendar = new GregorianCalendar();
//输出当前日期和时间信息
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));
//测试当前年份是否为闰年
if(gcalendar.isLeapYear(year)) {
System.out.println("当前年份是闰年");
}else {
System.out.println("当前年份不是闰年");
}
}
}
程序输出:
Date: Apr 23 2020
Time: 11:25:27
当前年份是闰年
更多交流,欢迎微信搜索并关注公众号 「 小白轻松学编程 」!
博客里所有教程会第一时间在公众号上更新哟,扫码关注一下吧~