Java 日期时间

Java 日期时间

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

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

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

Date( )

  1. 接受一个参数,该参数是从 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 代码,输出结果如下

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 代码,输出结果如下

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 代码,输出结果如下

全部日期和时间信息:星期二 一月 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 代码,输出结果如下

1818-11-11 Parses as Wed Nov 11 00:00:00 CST 1818
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!"); 
      }
   }
}
</pre>

[运行范例 »](https://www.twle.cn/t/yufei/java/basic/SleepDemo)

编译运行以上 Java 代码,输出结果如下

<pre style="box-sizing: border-box; overflow: hidden; font-family: monospace, monospace; font-size: 1em; margin-top: 0px; margin-bottom: 0px; overflow-wrap: break-word !important; display: block; border-radius: 2px; color: rgb(77, 77, 77); white-space: pre-wrap !important; padding: 10px;">$ java SleepDemo     
Tue Jan 23 08:10:07 CST 2018

Tue Jan 23 08:10:11 CST 2018
</pre>

## 测量时间

**System.currentTimeMillis()** 方法返回当前程序运行的时间

我们可以在两段代码之间调用它来测试运行时间

<pre style="box-sizing: border-box; overflow: hidden; font-family: monospace, monospace; font-size: 1em; margin-top: 0px; margin-bottom: 0px; overflow-wrap: break-word !important; display: block; border-radius: 2px; color: rgb(77, 77, 77); white-space: pre-wrap !important; padding: 10px;">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!");
      }
   }
}
</pre>

[运行范例 »](https://www.twle.cn/t/yufei/java/basic/DiffDemo)

编译运行以上 Java 代码,输出结果如下

<pre style="box-sizing: border-box; overflow: hidden; font-family: monospace, monospace; font-size: 1em; margin-top: 0px; margin-bottom: 0px; overflow-wrap: break-word !important; display: block; border-radius: 2px; color: rgb(77, 77, 77); white-space: pre-wrap !important; padding: 10px;">Tue Jan 23 08:12:43 CST 2018

Tue Jan 23 08:12:46 CST 2018

Difference is : 3044
</pre>

[← Java 数组](https://www.twle.cn/l/yufei/java/java-basic-array.html)[Java 日历 →](https://www.twle.cn/l/yufei/java/java-basic-calendar.html)

### Java 基础教程

<nav style="box-sizing: border-box; display: block;">[Java 基础教程](https://www.twle.cn/l/yufei/java/java-basic-index.html "Java 基础教程")[Java 简介](https://www.twle.cn/l/yufei/java/java-basic-intro.html "Java 简介")[Java 开发环境配置](https://www.twle.cn/l/yufei/java/java-basic-environment-setup.html "Java 开发环境配置")[Java 基础语法](https://www.twle.cn/l/yufei/java/java-basic-basic-syntax.html "Java 基础语法")[Java 对象和类](https://www.twle.cn/l/yufei/java/java-basic-object-classes.html "Java 对象和类")[Java 基本数据类型](https://www.twle.cn/l/yufei/java/java-basic-datatypes.html "Java 基本数据类型")[Java 常量](https://www.twle.cn/l/yufei/java/java-basic-constant.html "Java 常量")[Java 基本数据类型](https://www.twle.cn/l/yufei/java/java-basic-conversion.html "Java 基本数据类型")[Java 变量类型](https://www.twle.cn/l/yufei/java/java-basic-variable-types.html "Java 变量类型")[Java 访问控制符](https://www.twle.cn/l/yufei/java/java-basic-access-modifier.html "Java 访问控制符")[Java 非访问修饰符](https://www.twle.cn/l/yufei/java/java-basic-modifier-types.html "Java 非访问修饰符")[Java 运算符](https://www.twle.cn/l/yufei/java/java-basic-operators.html "Java 运算符")[Java 条件判断](https://www.twle.cn/l/yufei/java/java-basic-if-else-switch.html "Java 条件判断")[Java 条件之 if 语句](https://www.twle.cn/l/yufei/java/java-basic-if.html "Java 条件之 if 语句")[Java 条件之 if...else 语句](https://www.twle.cn/l/yufei/java/java-basic-ifelse.html "Java 条件之 if...else 语句")[Java 条件之 if...else if 语句](https://www.twle.cn/l/yufei/java/java-basic-multi-ifelse.html "Java 条件之 if...else if 语句")[Java 条件之嵌套 if 语句](https://www.twle.cn/l/yufei/java/java-basic-nested-if.html "Java 条件之嵌套 if 语句")[Java 条件之 switch 语句](https://www.twle.cn/l/yufei/java/java-basic-switch.html "Java 条件之 switch 语句")[Java 循环语句](https://www.twle.cn/l/yufei/java/java-basic-loop.html "Java 循环语句")[Java 循环之 while 语句](https://www.twle.cn/l/yufei/java/java-basic-while.html "Java 循环之 while 语句")[Java 循环之 do...while 语句](https://www.twle.cn/l/yufei/java/java-basic-dowhile.html "Java 循环之 do...while 语句")[Java 循环之 for 语句](https://www.twle.cn/l/yufei/java/java-basic-for.html "Java 循环之 for 语句")[Java break 语句](https://www.twle.cn/l/yufei/java/java-basic-break.html "Java break 语句")[Java continue 语句](https://www.twle.cn/l/yufei/java/java-basic-continue.html "Java continue 语句")[Java Number 类](https://www.twle.cn/l/yufei/java/java-basic-number.html "Java Number 类")[Java Math 类](https://www.twle.cn/l/yufei/java/java-basic-math.html "Java Math 类")[Java Character 类](https://www.twle.cn/l/yufei/java/java-basic-character.html "Java Character 类")[Java String 类](https://www.twle.cn/l/yufei/java/java-basic-string.html "Java String 类")[Java StringBuffer 和 StringBuilder 类](https://www.twle.cn/l/yufei/java/java-basic-stringbuffer.html "Java StringBuffer 和 StringBuilder 类")[Java 数组](https://www.twle.cn/l/yufei/java/java-basic-array.html "Java 数组")[Java 日期时间](https://www.twle.cn/l/yufei/java/java-basic-date-time.html "Java 日期时间")[Java 日历](https://www.twle.cn/l/yufei/java/java-basic-calendar.html "Java 日历")[Java 正则表达式](https://www.twle.cn/l/yufei/java/java-basic-regular-expressions.html "Java 正则表达式")[Java 方法](https://www.twle.cn/l/yufei/java/java-basic-methods.html "Java 方法")[Java 流 ( Stream )](https://www.twle.cn/l/yufei/java/java-basic-stream.html "Java 流 ( Stream )")[Java Scanner 类](https://www.twle.cn/l/yufei/java/java-basic-scanner.html "Java Scanner 类")[Java 读写文件](https://www.twle.cn/l/yufei/java/java-basic-files.html "Java 读写文件")[Java 目录操作方法](https://www.twle.cn/l/yufei/java/java-basic-dir.html "Java 目录操作方法")[Java 异常处理](https://www.twle.cn/l/yufei/java/java-basic-exceptions.html "Java 异常处理")[Java 源文件声明规则](https://www.twle.cn/l/yufei/java/java-basic-source-rule.html "Java 源文件声明规则")[Java 继承](https://www.twle.cn/l/yufei/java/java-basic-inheritance.html "Java 继承")[Java 重写 ( Override )](https://www.twle.cn/l/yufei/java/java-basic-override.html "Java 重写 ( Override )")[Java 重载 ( Overload )](https://www.twle.cn/l/yufei/java/java-basic-overload.html "Java 重载 ( Overload )")[Java 多态](https://www.twle.cn/l/yufei/java/java-basic-polymorphism.html "Java 多态")[Java 抽象类](https://www.twle.cn/l/yufei/java/java-basic-abstraction.html "Java 抽象类")[Java 封装](https://www.twle.cn/l/yufei/java/java-basic-encapsulation.html "Java 封装")[Java 接口](https://www.twle.cn/l/yufei/java/java-basic-interfaces.html "Java 接口")[Java 包 ( package )](https://www.twle.cn/l/yufei/java/java-basic-package.html "Java 包 ( package )")[Java 数据结构](https://www.twle.cn/l/yufei/java/java-basic-data-structures.html "Java 数据结构")[Java 集合框架](https://www.twle.cn/l/yufei/java/java-basic-collections.html "Java 集合框架")[Java 泛型](https://www.twle.cn/l/yufei/java/java-basic-generics.html "Java 泛型")[Java 序列化](https://www.twle.cn/l/yufei/java/java-basic-serialization.html "Java 序列化")[Java Socket 编程](https://www.twle.cn/l/yufei/java/java-basic-networking.html "Java Socket 编程")[Java URL 处理](https://www.twle.cn/l/yufei/java/java-basic-url-processing.html "Java URL 处理")[Java 发送邮件](https://www.twle.cn/l/yufei/java/java-basic-sending-email.html "Java 发送邮件")[Java 多线程编程](https://www.twle.cn/l/yufei/java/java-basic-multithreading.html "Java 多线程编程")[Java Applet 基础](https://www.twle.cn/l/yufei/java/java-basic-applet-basics.html "Java Applet 基础")[Java 文档注释](https://www.twle.cn/l/yufei/java/java-basic-documentation.html "Java 文档注释")[Java 范例](https://www.twle.cn/l/yufei/java/java-basic-examples.html "Java 范例")[Java 8 新特性](https://www.twle.cn/l/yufei/java/java-basic-java8-new-features.html "Java 8  新特性")[Java MySQL 连接](https://www.twle.cn/l/yufei/java/java-basic-mysql-connect.html "Java MySQL 连接")</nav>

</main>

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

Copyright © 2013-2018 简单教程 twle.cn All Rights Reserved.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容

  • java.util 包提供了Date类来封装当前的日期时间。Date类提供两个构造函数来实例化Date对象。 第二...
    南风_001阅读 525评论 0 0
  • 一.Date类 java.util 包提供了 Date 类来封装当前的日期和时间。 1.构造方法 使用当前日期和时...
    小石头呢阅读 211评论 0 0
  • Data类 Java.util包提供了Data类来封装当前的日期和时间。它有2个构造函数: public Date...
    ThreeGold阅读 487评论 0 4
  • 一、Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,...
    Liam大大阅读 7,428评论 0 5
  • 《我的前半生》很火的时候,并没有看这个电视剧,最近无意中翻到前夫哥,突然很想看一看,到底是怎样的前夫,让当时的雷佳...
    123_木头人阅读 230评论 0 0