日期和时间

Date

java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。

第一个构造函数使用当前日期和时间来初始化对象。

1
Date();

第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。

1
Date(long millisec);

Date 对象创建以后,可以调用下面的方法:http://www.runoob.com/java/java-date-time.html

获取当前日期时间

Java 中获取当前日期和时间很简单,使用 Date 对象的 toString() 方法来打印当前日期和时间:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import java.util.Date;
  
public class DateDemo {
   public static void main(String args[]) {
       // 初始化 Date 对象
       Date date = new Date();
        
       // 使用 toString() 函数显示日期时间
       System.out.println(date.toString());
   }
}

日期比较

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 类实现了这个接口。

使用 SimpleDateFormat 格式化日期

SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import  java.util.*;
import java.text.*;
 
public class DateDemo {
   public static void main(String args[]) {
 
      Date dNow = new Date( );
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
 
      System.out.println("当前时间为: " + ft.format(dNow));
   }
}

日期和时间的格式化编码

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

字母描述示例
G纪元标记AD
y四位年份2001
M月份July or 07
d一个月的日期10
hA.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
aA.M./P.M. 标记PM
k一天中的小时(1~24)24
KA.M./P.M. (0~11)格式小时10
z时区Eastern Standard Time
'文字定界符Delimiter
"单引号`

使用 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 解析可以参见:Java 格式化输出 printf 例子

解析字符串为时间

SimpleDateFormat 类有一些附加的方法,特别是 parse(),它试图按照给定的 SimpleDateFormat 对象的格式化存储来解析字符串。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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); 
      }
   }
}

JAVA 休眠

sleep() 使当前线程进入停滞状态(阻塞当前线程),让出 CPU 的使用、目的是不让当前线程独自霸占该进程所获的 CPU 资源,以留一定时间给其他线程执行的机会。

你可以让程序休眠一毫秒的时间或者到您的计算机的寿命长的任意段时间。例如,下面的程序会休眠 3 秒:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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!"); 
      }
   }
}

测量时间

下面的一个例子表明如何测量时间间隔(以毫秒为单位):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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!");
      }
   }
}

Calendar

Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。

Calendar 类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用 getInstance 方法创建即可。

创建对象

当前日期的对象:

1
Calendar c = Calendar.getInstance(); //默认是当前日期

创建一个指定日期的对象:

1
2
3
// 创建一个代表 2009 年 6 月 12 日的 Calendar 对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);

对象字段类型

Calendar 类中用以下这些常量表示不同的意义,jdk 内的很多类其实都是采用的这种思想

常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意义完全相同
Calendar.HOUR12小时制的小时
Calendar.HOUR_OF_DAY24小时制的小时
Calendar.MINUTE分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK星期几

对象类型的设置

set 方法的两个函数原型:

1
2
3
public final void set(int year,int month,int date);
    
public void set(int field,int value);

还可以使用 add 方法,示例代码如下:

1
2
c1.set(Calendar.DATE,10);
// 把 c1 对象代表的日期设置为 10 号,其它所有的数值会被重新计算

GregorianCalendar

Calendar 类实现了公历日历,GregorianCalendarCalendar 类的一个具体实现。

CalendargetInstance() 方法返回一个默认用当前的语言环境和时区初始化的 GregorianCalendar 对象。GregorianCalendar 定义了两个字段:AD 和 BC。这是代表公历定义的两个时代。