Java 日期时间
Java java.util.Date 类提供了操作日期与时间的一些方法
有两种方法生成一个 Date()
对象
-
没有任何参数,使用的是当前日期和时间来初始化对象
Date( )
-
接受一个参数,该参数是从 1970 年 1月1 日 0 时 0 分 0 秒起的毫秒数
Date(long millisec)
创建了 Date 对象以后,我们就可以调用 Date 类提供的下列方法
方法 | 描述 |
---|---|
boolean after(Date date) | 若当调用此方法的 Date 对象在指定日期之后返回 true,否则返回 false |
boolean before(Date date) | 若当调用此方法的 Date 对象在指定日期之前返回 true,否则返回 false |
Object clone() | 返回此对象的副本 |
int compareTo(Date date) | 比较当调用此方法的 Date 对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数 |
int compareTo(Object obj) | 若 obj 是 Date 类型则操作等同于 compareTo(Date) 。否则它抛出 ClassCastException |
boolean equals(Object date) | 当调用此方法的 Date对象和指定日期相等时候返回 true,否则返回 false |
long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 |
int hashCode( ) | 返回此对象的哈希码值 |
void setTime(long time) | 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期 |
String toString() | 转换 Date 对象为 String 表示形式,并返回该字符串 |
范例
下面的代码生成了一个 Date() 对象,然后调用 toString() 方法返回 String 形式的当前日期
import java.util.Date; public class CurrentDate { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用 toString() 函数显示日期时间 System.out.println(date.toString()); } }
编译运行以上 Java 代码,输出结果如下
$ javac CurrentDate.java $ java CurrentDate Tue Jan 23 07:43:47 CST 2018
日期比较
Java 中,比较两个日期有以下三种方法
- 使用 getTime() 方法获取两个日期自1970年1月1日经历的毫秒数值,然后比较这两个值
- 使用方法 before(),after() 和 equals() 方法,例如,一个月的 12 号比 18 号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回 true
- 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口
格式化日期
java.util.SimpleDateFormat 类是一个以语言环境敏感的方式来格式化和分析日期的类
SimpleDateFormat 可以自定义日期时间格式
import java.util.*; import java.text.*; public class SimpleDateFormatDemo { 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(ft.format(dNow)); } }
编译运行以上 Java 代码,输出结果如下
$ javac SimpleDateFormatDemo.java $ java SimpleDateFormatDemo Tue 2018.01.23 at 07:48:53 AM CST
上面这段代码中的
"E yyyy.MM.dd 'at' hh:mm:ss a zzz"
设定了转换的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒
有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时制
日期和时间的格式化编码
下表列出了 SimpleDateFormat 类支持的日期时间格式化符
字母 | 描述 | 范例 |
---|---|---|
G | 纪元标记 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M./P.M. (1~12)格式小时 | 12 |
H | 一天中的小时 (0~23) | 22 |
m | 分钟数 | 30 |
s | 秒数 | 55 |
S | 毫秒数 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2 (second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M./P.M. 标记 | PM |
k | 一天中的小时(1~24) | 24 |
K | A.M./P.M. (0~11)格式小时 | 10 |
z | 时区 | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 单引号 | ` |
使用 printf() 格式化日期
除了 SimpleDateFormat 类外,我们还可以使用 printf() 方法格式化时间和日期
printf() 方法使用两个字母格式,它以 %t 开头并且以下面表格中的一个字母结尾
格式化符 | 说明 | 示例 |
---|---|---|
c | 完整的日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
F | "年-月-日"格式 | 2007-10-27 |
D | "月/日/年"格式 | 10/27/07 |
r | "HH:MM:SS PM"格式(12时制) | 02:25:51 下午 |
T | "HH:MM:SS"格式(24时制) | 14:28:16 |
R | "HH:MM"格式(24时制) | 14:28 |
范例
下面的代码使用 printf() 方法输出当前的日期
import java.util.Date; public class PrintfDateDemo { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); //c的使用 System.out.printf("全部日期和时间信息:%tc%n",date); //f的使用 System.out.printf("年-月-日格式:%tF%n",date); //d的使用 System.out.printf("月/日/年格式:%tD%n",date); //r的使用 System.out.printf("HH:MM:SS PM格式(12时制):%tr%n",date); //t的使用 System.out.printf("HH:MM:SS格式(24时制):%tT%n",date); //R的使用 System.out.printf("HH:MM格式(24时制):%tR",date); } }
编译运行以上 Java 代码,输出结果如下
$ javac PrintfDateDemo.java $ java PrintfDateDemo 全部日期和时间信息:星期二 一月 23 07:56:33 CST 2018 年-月-日格式:2018-01-23 月/日/年格式:01/23/18 HH:MM:SS PM格式(12时制):07:56:33 上午 HH:MM:SS格式(24时制):07:56:33 HH:MM格式(24时制):07:56
如果想要重复的格式化一个日期,那么上面这种方法就太低效了
当我们可以使用一个格式化字符串指出要被格式化的参数的索引
索引必须紧跟在 % 后面,而且必须以 $ 结束
import java.util.Date; public class PrintfDateDemo2 { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用toString()显示日期和时间 System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date); } }
编译运行以上 Java 代码,输出结果如下
Due date: 一月 23, 2018
或者,我们可以使用 <
标志,它表明先前被格式化的参数要被再次使用
import java.util.Date; public class PrintfDateDemo3 { public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 显示格式化时间 System.out.printf("%s %tB %<te, %<tY", "Due date:", date); } }
编译运行以上 Java 代码,输出结果如下
Due date: 一月 23, 2018
定义日期格式的转换符可以使日期通过指定的转换符生成新字符串
import java.util.*; public class DateDemo2 { public static void main(String args[]) { Date date=new Date(); //b的使用,月份简称 String str=String.format(Locale.US,"英文月份简称:%tb",date); System.out.println(str); System.out.printf("本地月份简称:%tb%n",date); //B的使用,月份全称 str=String.format(Locale.US,"英文月份全称:%tB",date); System.out.println(str); System.out.printf("本地月份全称:%tB%n",date); //a的使用,星期简称 str=String.format(Locale.US,"英文星期的简称:%ta",date); System.out.println(str); //A的使用,星期全称 System.out.printf("本地星期的简称:%tA%n",date); //C的使用,年前两位 System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date); //y的使用,年后两位 System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date); //j的使用,一年的天数 System.out.printf("一年中的天数(即年的第几天):%tj%n",date); //m的使用,月份 System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date); //d的使用,日(二位,不够补零) System.out.printf("两位数字的日(不足两位前面补0):%td%n",date); //e的使用,日(一位不补零) System.out.printf("月份的日(前面不补0):%te",date); } }
编译运行以上 Java 代码,输出结果如下
英文月份简称:Jan 本地月份简称:一月 英文月份全称:January 本地月份全称:一月 英文星期的简称:Tue 本地星期的简称:星期二 年的前两位数字(不足两位前面补0):20 年的后两位数字(不足两位前面补0):18 一年中的天数(即年的第几天):023 两位数字的月份(不足两位前面补0):01 两位数字的日(不足两位前面补0):23 月份的日(前面不补0):23
解析字符串为时间
SimpleDateFormat 类的 parse() 方法可以按照指定的 SimpleDateFormat 对象的格式化存储来解析字符串
import java.util.*; import java.text.*; public class DateDemo3 { 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); } } }
编译运行以上 Java 代码,输出结果如下
$ java DateDemo3 1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818 $ java DateDemo3 2018-02-14 2018-02-14 Parses as Wed Feb 14 00:00:00 CST 2018
Java 休眠( sleep )
Thread.sleep() 方法可以使当前线程进入停滞状态 ( 阻塞当前线程 ),让出 CPU 的使用、目的是不让当前线程独自霸占该进程所获的 CPU 资源,以留一定时间给其他线程执行的机会
sleep() 方法的唯一参数是以毫秒表示的时间
import java.util.*; public class SleepDemo { public static void main(String args[]) { try { System.out.println(new Date( ) + "\n"); Thread.sleep(1000*3); // 休眠3秒 System.out.println(new Date( ) + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } }
编译运行以上 Java 代码,输出结果如下
$ java SleepDemo Tue Jan 23 08:10:07 CST 2018 Tue Jan 23 08:10:11 CST 2018
测量时间
System.currentTimeMillis() 方法返回当前程序运行的时间
我们可以在两段代码之间调用它来测试运行时间
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!"); } } }
编译运行以上 Java 代码,输出结果如下
Tue Jan 23 08:12:43 CST 2018 Tue Jan 23 08:12:46 CST 2018 Difference is : 3044