Java 日期时间

Java java.util.Date 类提供了操作日期与时间的一些方法

有两种方法生成一个 Date() 对象

  1. 没有任何参数,使用的是当前日期和时间来初始化对象

    Date( )
    
  2. 接受一个参数,该参数是从 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 中,比较两个日期有以下三种方法

  1. 使用 getTime() 方法获取两个日期自1970年1月1日经历的毫秒数值,然后比较这两个值
  2. 使用方法 before(),after() 和 equals() 方法,例如,一个月的 12 号比 18 号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回 true
  3. 使用 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

Java 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2018 简单教程 twle.cn All Rights Reserved.