Java中的日期和时间

以下内容引用自http://wiki.jikexueyuan.com/project/java/date-time.html

Java在java.util包中提供了Date类,这个类封装了当前的日期和时间。

Date类支持两种构造函数。第一个构造函数初始化对象的当前日期和时间。

Date()

下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数

Date(long millisec)

一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间:

方法 描述
boolean after(Date date) 如果调用Date对象包含或晚于指定的日期则返回true,否则,返回false。
boolean before(Date date) 如果调用Date对象包含或早于日期指定的日期返回true,否则,返回false。
Object clone( ) 重复调用Date对象。
int compareTo(Date date) 调用对象的值与日期比较。如果这两个值相等返回0。如果调用对象是早于日期返回一个负值。如果调用对象迟于日期返回正值。
int compareTo(Object obj) 以相同的compareTo(Date)操作 如果obj是一个类日期。否则,它会抛出一个ClassCastException。
boolean equals(Object date) 如果调用Date对象包含相同的时间及日期指定日期则返回true,否则,返回false。
long getTime( ) 返回自1970年1月1日起已经过的毫秒数。
int hashCode( ) 返回调用对象的哈希代码。
void setTime(long time) 设置所指定的时间,这表示从1970年1月1日从午夜的时间和日期以毫秒为单位经过的时间。
String toString( ) 调用Date对象转换为字符串,并返回结果。

一、获取当前日期和时间

在Java中容易得到当前的日期和时间。可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间:

import java.util.Date;

public class DateDemo {
   public static void main(String args[]) {
       // Instantiate a Date object
       Date date = new Date();

       // display time and date using toString()
       System.out.println(date.toString());
   }
}
//这将产生以下结果:
Wed May 31 15:20:32 CST 2017

二、日期比较

有以下三种方式来比较两个日期:

  • 可以使用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允许选择用户定义的模式为日期时间格式。例如:

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: 星期三 2017.05.31 at 03:22:48 下午 CST

四、简单的DateFormat格式代码

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

字符 描述 例子
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 时区 东部标准时间
脱离文本 分隔符
" 单引号 `

注意:有些中文版的操作系统返回值可能为中文。

五、用printf格式化日期

日期和时间格式用printf方法可以非常轻松地做到。可以使用两个字母的格式,从t开始并在下面给出的表格中的其中一个字母结束。例如:

import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
     // Instantiate a Date object
     Date date = new Date();

     // display time and date using toString()
     String str = String.format("Current Date/Time : %tc", date );

     System.out.printf(str);
  }
}
//这将产生以下结果:
Current Date/Time : 星期三 五月 31 15:25:43 CST 2017

如果提供日期多次格式化是一种不好的做法。一个格式字符串可以指示要格式化的参数的索引。

索引必须紧跟在%之后,并必须由$终止。例如:

import java.util.Date;

public class DateDemo {

   public static void main(String args[]) {
       // Instantiate a Date object
       Date date = new Date();

       // display time and date using toString()
       System.out.printf("%1$s %2$tB %2$td, %2$tY",
                         "Due date:", date);
   }
}
//这将产生以下结果:
Due date: 五月 31, 2017

或者,也可以使用<标志。则表示相同的参数,根据前述格式规范,应再次使用。例如:

import java.util.Date;

public class DateDemo {

   public static void main(String args[]) {
       // Instantiate a Date object
       Date date = new Date();

       // display formatted date
       System.out.printf("%s %tB %<te, %<tY",
                         "Due date:", date);
   }
}
//这将产生以下结果:
Due date: 五月 31, 2017

六、日期和时间转换字符

字符 描述 例子
c 完整的日期和时间 Mon May 04 09:51:52 CDT 2009
F ISO 8601 日期 2004-02-09
D U.S. 格式时间 (月/日/年) 02/09/2004
T 24-时制 18:05:19
r 12-时制 06:05:19 pm
R 24-时制,无秒 18:05
Y 四位数年份 (用前行零列) 2004
y 年份的后两位数(用前行零列) 04
C 年份的前两位(用前行零列) 20
B 完整月份名称 February
b 缩写月份名称 Feb
m 两位数月份 (用前行零列) 02
d 两位数日期 (用前行零列) 03
e 两位数日期(无前行零列) 9
A 完整星期名称 Monday
a 缩写星期名称 Mon
j 年中的三位数天数(用前行零列) 069
H 两位数小时(用前行零列), 00 和 23之间 18
k 两位数小时(无前行零列), 0 和 23 之间 18
I 两位数小时 (用前行零列), 01和12之间 06
l 两位数小时 (无前行零列), 1 和12之间 6
M 两位数分钟 (用前行零列) 05
S 两位数秒钟(用前行零列) 19
L 三位数毫秒(用前行零列) 047
N 九位数纳秒 (用前行零列) 047000000
P 大写上下午标记 PM
p 小写上下午标记 pm
z RFC 822 从GMT数字抵消 -0800
Z 时区 PST
s 从 1970-01-01 00:00:00 的秒数GMT 1078884319
Q 从 1970-01-01 00:00:00 的毫秒数GMT 1078884319047

有相关的日期和时间等有用的类。欲了解更多详细信息,可以参考Java标准文档。

七、字符串转换日期

SimpleDateFormat类有一些额外的方法,如parse(),它试图根据存储在给定SimpleDateFormat的对象的格式来转换字符串。例如:

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 DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007

八、休眠一段时间

可以进行任何期间的时间休眠,从一毫秒直到电脑的整个生命周期。例如,下面的程序会休眠10秒:

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!");
      }
   }
}
//这将产生以下结果:
Wed May 31 15:37:56 CST 2017
Wed May 31 15:37:59 CST 2017

九、测量执行时间

有时候,可能需要测量的时间点以毫秒为单位。因此,重新写上面的例子:

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!");
      }
   }
}
//这将产生以下结果:Wed May 31 15:38:58 CST 2017Wed May 31 15:39:01 CST 2017Difference is : 3013

十、GregorianCalendar类

GregorianCalendar是一个Calendar类具体的实现,即对正常Gregorian公历的实现。

Calendar的getInstance()方法返回与当前日期和时间默认语言环境和时区初始化的一个GregorianCalendar。GregorianCalendar中定义了两个字段:AD和BC。这些代表在公历中定义的两个时代。

也有几个构造函数的GregorianCalendar对象:

构造函数 描述
GregorianCalendar()  在默认时区与默认语言环境使用当前时间构造默认的GregorianCalendar。
GregorianCalendar(int year, int month, int date)  在默认时区设置默认的语言环境用给定的日期构造一个GregorianCalendar
GregorianCalendar(int year, int month, int date, int hour, int minute)  用给定的日期和时间设置为与默认语言环境的默认时区构造一个GregorianCalendar。
GregorianCalendar(int year, int month, int date, int hour, int minute, int second)  用给定的日期和时间设置为与默认语言环境的默认时区构造一个 GregorianCalendar
GregorianCalendar(Locale aLocale)  基于当前时间与给定语言环境的默认时区构建一个GregorianCalendar。
GregorianCalendar(TimeZone zone)  基于当前时间,使用默认的语言环境在给定的时区构建一个GregorianCalendar。
GregorianCalendar(TimeZone zone, Locale aLocale)  基于当前时间与给定语言环境的给定时区构建一个GregorianCalendar。

这里是由GregorianCalendar类提供的一些有用的方法的列表:

方法 描述
void add(int field, int amount)  基于日历的规则,以给定的时间字段添加指定(有符号的)时间量。
protected void computeFields()  将UTC转换为毫秒时间字段值.
protected void computeTime()  覆盖日历转换时间域值为UTC的毫秒.
boolean equals(Object obj)  这个GregorianCalendar与一个对象引用比较.
int get(int field)  获取给定时间域的值.
int getActualMaximum(int field)  返回该字段可能的最大值,给定到当前的日期.
int getActualMinimum(int field)  返回该字段可能具有的最小值,给定当前的日期.
int getGreatestMinimum(int field)  对于给定的字段中返回高最低值(如果有变化).
Date getGregorianChange()  获取公历更改日期.
int getLeastMaximum(int field)  对于给定的字段返回最低的最大值,如果有变化.
int getMaximum(int field)  返回给定字段中的最大值.
Date getTime()  获取日历的当前时间.
long getTimeInMillis()  获取日历的当前时间长.
TimeZone getTimeZone()  获取时区.
int getMinimum(int field)  返回给定字段中的最小值.
int hashCode()  重写hashCode.
boolean isLeapYear(int year)  确定给定年份是闰年.
void roll(int field, boolean up)  加上或减去(上/下)的时间在给定的时间字段一个单元,不更改更大的字段.
void set(int field, int value)  设置时间字段与给定值.
void set(int year, int month, int date)  设置为年,月,日的值.
void set(int year, int month, int date, int hour, int minute)  设置为年,月,日,小时和分钟值.
void set(int year, int month, int date, int hour, int minute, int second)  设置为字段的年,月,日,小时,分钟和秒的值.
void setGregorianChange(Date date)  设置GregorianCalendar更改日期.
void setTime(Date date)  设置日历的当前时间与给定日期.
void setTimeInMillis(long millis)  从给定long值设置日历的当前时间.
void setTimeZone(TimeZone value)  将时区设置与给定的时区值.
String toString()  返回此日历的字符串表示形式.

示例:

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;
      // Create a Gregorian calendar initialized
      // with the current date and time in the
      // default locale and timezone.
      GregorianCalendar gcalendar = new GregorianCalendar();
      // Display current time and date information.
      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));

      // Test if the current year is a leap year
      if(gcalendar.isLeapYear(year)) {
         System.out.println("The current year is a leap year");
      }
      else {
         System.out.println("The current year is not a leap year");
      }
   }
}
//这将产生以下结果:Date: May 31 2017Time: 3:44:49The current year is not a leap year

在Calendar类中的可用常量的完整列表,可以参考标准的Java文档。

测试工程:https://github.com/easonjim/5_java_example/tree/master/javabasicstest/test11

时间: 2024-10-02 16:22:06

Java中的日期和时间的相关文章

java中获取日期和时间的方法总结

1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); date.getTime() ; 还有一种方式,使用 System.currentTimeMillis() ;都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数 一.获取当前时间,   格式为:   yyyy-mm-dd   hh-mm

Java中的日期与时间(Date,Calendar)

1. Calendar是个抽象类,静态方法getInstance() 可以得到它的一个实例 Calendar ca = Calendar.getInstance(): ca.set(2015, 10,20);//通过set可以设置Year.Month.date.hour.minute.second,注意月是从0开始的0-11(不设置则默认为系统当前时间): System.out.println(ca.get(Calendar.YEAR));//通过get(Calendar.XXX)可以拿到相应年

填坑:Java 中的日期转换

我们之前讨论过时间,在Java 中有一些方法会出现横线?比如Date 过期方法. 参考文章:知识点:java一些方法会有横线?以Date 过期方法为例 Java中的日期和时间处理方法 Date类(官方不再推荐使用,官方解释Date类不利于国际化,推荐使用Calendar类) Calendar类 DateFormat类 使用此类来时间初始化 我们发现,时间toLocalString 会有横线: vo.setSubmitDate(new Date().toLocaleString()); 可以改为:

Java 8的日期和时间API

本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍.Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API. 我们先从日期和时间的表示开始

JAVA中获取当前系统时间及格式转换

JAVA中获取当前系统时间 一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowString {public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式System.out.pr

详解Java中格式化日期的DateFormat与SimpleDateFormat类

DateFormat其本身是一个抽象类,SimpleDateFormat 类是DateFormat类的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat类完成,下面我们具体来看一下两个类的用法: DateFormat1. DateFormat 介绍DateFormat 的作用是 格式化并解析“日期/时间”.实际上,它是Date的格式化工具,它能帮助我们格式化Date,进而将Date转换成我们想要的String字符串供我们使用不过DateFormat

java中的日期处理类总结

转自 http://blog.csdn.net/shibenjie/article/details/4263912 java中的日期处理类总结:Date/Calendar/GregorianCalendar/DateFormat/SimpleDateFormat类 今天花了好大一点时间把java的日期类做了一下整理,哈 1.         Date类(该类现在很少用了) l         Date类对象的创建: n         创建一个当前时间 //默认是创建一个代表系统当前日期的Dat

计算机程序的思维逻辑 (95) - Java 8的日期和时间API

?本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍.Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API. 我们先从日期和时间的表示开

java8中处理日期和时间

Java 8 中如何处理日期和时间 1. 在 Java 8 中获取今天的日期 Java 8 中的 LocalDate 用于表示当天日期.和 java.util.Date 不同,它只有日期,不包含时间.当你仅需要表示日期时就用这个类. LocalDate now = LocalDate.now(); System.out.println(now); //结果 2018-06-20 2. 在 Java 8 中获取年.月.日信息 LocalDate 类提供了获取年.月.日的快捷方法,其实例还包含很多其