`
这些年
  • 浏览: 387862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 日期类型数据(转)

    博客分类:
  • java
 
阅读更多

原文作者:臧圩人(zangweiren) 
原文网址:http://zangweiren.iteye.com 


日期和时间的处理不仅在面试题中会考到,在实际项目开发中也是我们经常需要处理的问题,似乎没有哪个项目可以避开它们,我们常常在处理用户的出生年月日、注册日期,订单的创建时间等属性时用到,由此可见其重要性。

java.util.Date类 

提到日期和时间,我想大家最先想到应该是java.util.Date类吧。Date类可以精确到毫秒数,这个毫秒数是相对于格林威治标准时间 “1970-01-01 00:00:00.000 GMT”的差值。那么,什么是格林威治标准时间呢?要回答这个问题,我们需要先来了解一下世界时间标准方面的知识。 

世界时间标准主要有UTC,即Coordinated Universal Time(中文名译作世界协调时间、世界统一时间或世界标准时间),以及GMT,即Greenwich Mean Time(中文名译作格林威治标准时间或格林威治平均时间)两种。严格来讲,UTC比GMT更加精确一些,不过它们的差值不会超过0.9秒,如果超过了,将会为UTC增加闰秒以与GMT,也就是地球自转周期保持一致。所以在日常使用中,我们可以把UTC和GMT一样看待。 

日期和时间的表示是与我们所处的时区相关联的,如果我们不指定时区,那么它们将以系统默认的时区来显示。我们先来看看如何创建日期对象。Date类有很多个构造器方法,大部分已经不被赞成使用了(Deprecated),不过还剩下两个可以使用的: 

public Date() { 
    this(System.currentTimeMillis()); 
} 

public Date(long date) { 
    //other code 
} 

第一个是无参构造器,使用系统当前时间的毫秒数来创建Date对象,它调用了java.lang.System类的currentTimeMillis()来取得系统的当前时间的毫秒值。这是个本地方法,它的定义如下: 
Java代码 
public static native long currentTimeMillis();  

public static native long currentTimeMillis(); 

第二个构造器是根据给定的毫秒数来创建一个与之对应的Date对象,这个毫秒数决定了被创建对象的年、月、日、时、分、秒属性的值。 

我们来看看日期和时间在默认时区下的显示效果: 
Java代码 
import java.util.Date;   
  
public class DateTest {   
    public static void main(String[] args) {   
        Date d = new Date();   
        // 在默认时区下输出日期和时间值   
        System.out.println(d);   
    }   
 

import java.util.Date; 

public class DateTest { 
public static void main(String[] args) { 
Date d = new Date(); 
// 在默认时区下输出日期和时间值 
System.out.println(d); 
} 
} 

运行结果: 

Tue Jul 22 10:44:47 CST 2008 

大家应该注意到了年份前的“CST”标识,它是 China Standard Time的缩写,指的是中国标准时间,也就是我们常说的北京时间。它与UTC的时差是UTC+8:00,就是说北京时间比世界标准时间早8个小时,如果世界标准时间是早上1点,北京时间就是早上9点。一般情况下我们不需要关心时区问题。 

在创建完Date对象之后,我们可以通过调用getTime()方法来获得该对象的毫秒数值,调用setTime(long time)方法来设置它的毫秒数值,从而影响年、月、日、时、分、秒这些属性。这两个方法的定义如下: 
Java代码 
public long getTime() {   
    //other code   
}   
  
public void setTime(long time) {   
    //other code   
 

public long getTime() { 
    //other code 
} 

public void setTime(long time) { 
    //other code 
} 

既然Date对象可以表示盛相对于“1970-01-01 00:00:00.000 GMT”的毫秒数,我们自然可以通过这个值来比较两个日期的大小了,不过对于日期来讲,前后的说法应该更为恰当。而Date类已经为我们提供了这样的方法: 
Java代码 
public boolean before(Date when) {   
    //other code   
}   
  
public boolean after(Date when) {   
    //other code   
}   
  
public int compareTo(Date anotherDate) {   
    //other code   
 

public boolean before(Date when) { 
    //other code 
} 

public boolean after(Date when) { 
    //other code 
} 

public int compareTo(Date anotherDate) { 
    //other code 
} 

before()是判断当前日期是否在参数日期之前,即当前日期毫秒数小于参数日期毫秒数;after()是判断当前日期是否在参数日期之后,即当前日期毫秒数大于参数日期毫秒数。而compareTo()是将当前日期与参数日期比较后,返回一个int型值,它的返回值有三种可能:-1、0和1。如果返回-1则表示当前日期在参数日期之前;如果返回0则表示两个日期是同一时刻;返回1则表示当前日期在参数日期之后。虽然我们可以用compareTo()方法来比较两个Date对象,但是它的设计实际是另有用途的,我们在后面的章节将会讲到。 

下面我们就用一个示例来检验一下以上方法的用法: 
Java代码 
import java.util.Date;   
  
public class DateTest {   
    public static void main(String[] args) {   
        // 2008-08-08 20:00:00对应的毫秒数   
        long t2008 = 1218196800000L;   
        // 1900-01-01 20:00:00对应的毫秒数   
        long t1900 = -2208945952000L;   
  
        // 指定毫秒数创建Date对象   
        Date d2008 = new Date(t2008);   
        // 使用系统默认时间创建Date对象   
        Date d1900 = new Date();   
        // 通过设置毫秒数改变日期和时间   
        d1900.setTime(t1900);   
  
        System.out.println("调用方法:d1900.before(d2008)");   
        System.out   
                .print("比较结果:\"1900-01-01 20:00:00\"在\"2008-08-08 20:00:00\"");   
        // 使用before()方法比较   
        if (d1900.before(d2008)) {   
            System.out.println("之前");   
        } else {   
            System.out.println("之后");   
        }   
           
        System.out.println();   
           
        System.out.println("调用方法:d2008.after(d1900)");   
        System.out   
                .print("比较结果:\"2008-08-08 20:00:00\"在\"1900-01-01 20:00:00\"");   
        // 使用after()方法比较   
        if (d2008.after(d1900)) {   
            System.out.println("之后");   
        } else {   
            System.out.println("之前");   
        }   
           
        System.out.println();   
           
        System.out.println("调用方法:d1900.compareTo(d2008)");   
        System.out   
                .print("比较结果:\"1900-01-01 20:00:00\"在\"2008-08-08 20:00:00\"");   
        // 使用compareTo()方法比较   
        int i = d1900.compareTo(d2008);   
        if (i == -1) {   
            System.out.println("之前");   
        } else if (i == 1) {   
            System.out.println("之后");   
        } else if (i == 0) {   
            System.out.println("是同一时刻");   
        }   
    }   
 

import java.util.Date; 

public class DateTest { 
public static void main(String[] args) { 
// 2008-08-08 20:00:00对应的毫秒数 
long t2008 = 1218196800000L; 
// 1900-01-01 20:00:00对应的毫秒数 
long t1900 = -2208945952000L; 

// 指定毫秒数创建Date对象 
Date d2008 = new Date(t2008); 
// 使用系统默认时间创建Date对象 
Date d1900 = new Date(); 
// 通过设置毫秒数改变日期和时间 
d1900.setTime(t1900); 

System.out.println("调用方法:d1900.before(d2008)"); 
System.out 
.print("比较结果:\"1900-01-01 20:00:00\"在\"2008-08-08 20:00:00\""); 
// 使用before()方法比较 
if (d1900.before(d2008)) { 
System.out.println("之前"); 
} else { 
System.out.println("之后"); 
} 

System.out.println(); 

System.out.println("调用方法:d2008.after(d1900)"); 
System.out 
.print("比较结果:\"2008-08-08 20:00:00\"在\"1900-01-01 20:00:00\""); 
// 使用after()方法比较 
if (d2008.after(d1900)) { 
System.out.println("之后"); 
} else { 
System.out.println("之前"); 
} 

System.out.println(); 

System.out.println("调用方法:d1900.compareTo(d2008)"); 
System.out 
.print("比较结果:\"1900-01-01 20:00:00\"在\"2008-08-08 20:00:00\""); 
// 使用compareTo()方法比较 
int i = d1900.compareTo(d2008); 
if (i == -1) { 
System.out.println("之前"); 
} else if (i == 1) { 
System.out.println("之后"); 
} else if (i == 0) { 
System.out.println("是同一时刻"); 
} 
} 
} 

运行结果: 

调用方法:d1900.before(d2008) 
比较结果:"1900-01-01 20:00:00"在"2008-08-08 20:00:00"之前 

调用方法:d2008.after(d1900) 
比较结果:"2008-08-08 20:00:00"在"1900-01-01 20:00:00"之后 

调用方法:d1900.compareTo(d2008) 
比较结果:"1900-01-01 20:00:00"在"2008-08-08 20:00:00"之前 

那么如果我们想直接获取或者改变年、月、日、时、分、秒等等这些属性的值时怎么办呢?Date类当然有完成这些操作的方法,不过遗憾的是它们也都已经不被赞成使用了。我们必须换一个能够提供这些操作的类,这个类就是java.util.Calendar。 

公历历法java.util.GregorianCalendar 

Calendar 是一个抽象类,我们无法直接实例化它,它有一个具体子类实体类java.util.GregorianCalendar,这个类实现的就是我们日常所用的公历历法,或者叫做阳历。我们可以直接使用new命令创建它的实例,或者使用Calendar类的这个方法来获得它实例: 
Java代码 
public static Calendar getInstance(){   
    //other code   
 

public static Calendar getInstance(){ 
    //other code 
} 

采用上面这个方法时,我们创建的Calendar对象的日期和时间值是对象被创建时系统日期和时间值。当使用new命令时,我们有两种选择,一种是使用系统当前的日期和时间值初始化GregorianCalendar对象;另一种是通过给定年、月、日、时、分、秒等属性值来对其进行初始化。请看下面的例子: 
Java代码 
import java.text.DateFormat;   
import java.text.SimpleDateFormat;   
import java.util.Calendar;   
import java.util.GregorianCalendar;   
  
public class DateTest {   
    /**  
     * 以一种较为友好的方式格式化日期时间值  
     *   
     * @param c  
     *            日期时间对象  
     * @return 格式化后的日期时间字符串  
     */  
    public static String toFriendlyString(Calendar c) {   
        if (c != null) {   
            DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");   
            return df.format(c.getTime());   
        }   
        return null;   
    }   
  
    public static void main(String[] args) {   
        Calendar c1 = Calendar.getInstance();   
        System.out.println("创建方式:Calendar.getInstance()");   
        System.out.println("日期时间:" + DateTest.toFriendlyString(c1));   
        System.out.println();   
  
        Calendar c2 = new GregorianCalendar();   
        System.out.println("创建方式:new GregorianCalendar()");   
        System.out.println("日期时间:" + DateTest.toFriendlyString(c2));   
        System.out.println();   
  
        // 参数含义依次为:年、月、日   
        Calendar c3 = new GregorianCalendar(2008, 8,;   
        System.out.println("创建方式:new GregorianCalendar(2008, 8,");   
        System.out.println("日期时间:" + DateTest.toFriendlyString(c3));   
        System.out.println();   
  
        // 参数含义依次为:年、月、日、时、分   
        Calendar c4 = new GregorianCalendar(2008, 8, 8, 6, 10);   
        System.out.println("创建方式:new GregorianCalendar(2008, 8, 8, 6, 10)");   
        System.out.println("日期时间:" + DateTest.toFriendlyString(c4));   
        System.out.println();   
  
        // 参数含义依次为:年、月、日、时、分、秒   
        Calendar c5 = new GregorianCalendar(2008, 8, 8, 18, 10, 5);   
        System.out.println("创建方式:new GregorianCalendar(2008, 8, 8, 18, 10, 5)");   
        System.out.println("日期时间:" + DateTest.toFriendlyString(c5));   
    }   
 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 

public class DateTest { 
/** 
* 以一种较为友好的方式格式化日期时间值 
* 
* @param c 
*            日期时间对象 
* @return 格式化后的日期时间字符串 
*/ 
public static String toFriendlyString(Calendar c) { 
if (c != null) { 
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); 
return df.format(c.getTime()); 
} 
return null; 
} 

public static void main(String[] args) { 
Calendar c1 = Calendar.getInstance(); 
System.out.println("创建方式:Calendar.getInstance()"); 
System.out.println("日期时间:" + DateTest.toFriendlyString(c1)); 
System.out.println(); 

Calendar c2 = new GregorianCalendar(); 
System.out.println("创建方式:new GregorianCalendar()"); 
System.out.println("日期时间:" + DateTest.toFriendlyString(c2)); 
System.out.println(); 

// 参数含义依次为:年、月、日 
Calendar c3 = new GregorianCalendar(2008, 8,; 
System.out.println("创建方式:new GregorianCalendar(2008, 8,"); 
System.out.println("日期时间:" + DateTest.toFriendlyString(c3)); 
System.out.println(); 

// 参数含义依次为:年、月、日、时、分 
Calendar c4 = new GregorianCalendar(2008, 8, 8, 6, 10); 
System.out.println("创建方式:new GregorianCalendar(2008, 8, 8, 6, 10)"); 
System.out.println("日期时间:" + DateTest.toFriendlyString(c4)); 
System.out.println(); 

// 参数含义依次为:年、月、日、时、分、秒 
Calendar c5 = new GregorianCalendar(2008, 8, 8, 18, 10, 5); 
System.out.println("创建方式:new GregorianCalendar(2008, 8, 8, 18, 10, 5)"); 
System.out.println("日期时间:" + DateTest.toFriendlyString(c5)); 
} 
} 

运行结果如下: 

创建方式:Calendar.getInstance() 
日期时间:2008年07月22日 11:54:48 

创建方式:new GregorianCalendar() 
日期时间:2008年07月22日 11:54:48 

创建方式:new GregorianCalendar(2008, 8, 
日期时间:2008年09月08日 00:00:00 

创建方式:new GregorianCalendar(2008, 8, 8, 6, 10) 
日期时间:2008年09月08日 06:10:00 

创建方式:new GregorianCalendar(2008, 8, 8, 18, 10, 5) 
日期时间:2008年09月08日 18:10:05 

为了便于阅读,我们增加一个toFriendlyString(Calendar c)方法,它将日期时间值格式化为一种更加友好易懂的形式,我们将在接下来的内容中讲解它的实现原理。分析运行结果后,我们发现有两个地方需要注意: 

在创建GregorianCalendar对象时,月份值都设定为8,但打印结果都是9月份。这并不是我们的代码有问题,而是因为JAVA表示的月份是从0开始的,也就是说它用来表示月份的数值总是比实际月份值小1。因此我们要表示8月份,就是应该设置8-1=7这个值。 
GregorianCalendar的小时数是24小时制的。 

为了避免出现因为忘记处理1的差值而设置了错误的月份,也让代码看起来更加直观,推荐大家使用定义在Calendar类的的这些常量来代替直接用数字表示月份: 

一月:Calendar.JANUARY = 0 
二月:Calendar.FEBRUARY = 1 
三月:Calendar.MARCH = 2 
四月:Calendar.APRIL = 3 
五月:Calendar.MAY = 4 
六月:Calendar.JUNE = 5 
七月:Calendar.JULY = 6 
八月:Calendar.AUGUST = 7 
九月:Calendar.SEPTEMBER = 8 
十月:Calendar.OCTOBER = 9 
十一月:Calendar.NOVEMBER = 10 
十二月:Calendar.DECEMBER = 11 

如果我们想要从Calendar对象获得各种属性的值,就需要调用它的get(int field)方法,这个方法接收一个int型的参数,并且根据这个给定参数的值来返回相应的属性的值。该方法的定义如下: 
Java代码 
public int get(int field){   
    //other code   
 

public int get(int field){ 
    //other code 
} 

我们以一个示例来说明get(int field)方法所能接受的一些常用参数的含义及用法: 
Java代码 
import java.text.DateFormat;   
import java.text.SimpleDateFormat;   
import java.util.Calendar;   
  
public class DateTest {   
    /**  
     * 以一种较为友好的方式格式化日期时间值  
     *   
     * @param c  
     *            日期时间对象  
     * @return 格式化后的日期时间字符串  
     */  
    public static String toFriendlyString(Calendar c) {   
        if (c != null) {   
            DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss.SSS");   
            return df.format(c.getTime());   
        }   
        return null;   
    }   
  
    public static void main(String[] args) {   
        Calendar c = Calendar.getInstance();   
        System.out.println("当前时刻:" + DateTest.toFriendlyString(c));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.AM_PM");   
        System.out.println("代表含义:上下午标识,上午返回Calendar.AM=0,下午返回Calendar.PM=1");   
        System.out.println("测试结果:" + c.get(Calendar.AM_PM));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.DATE");   
        System.out.println("代表含义:一个月中的第几天,同Calendar.DAY_OF_MONTH");   
        System.out.println("测试结果:" + c.get(Calendar.DATE));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.DAY_OF_MONTH");   
        System.out.println("代表含义:一个月中的第几天,同Calendar.DATE");   
        System.out.println("测试结果:" + c.get(Calendar.DAY_OF_MONTH));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.DAY_OF_WEEK");   
        System.out.println("代表含义:一周中的第几天,对应星期几,第一天为星期日,于此类推。");   
        System.out.println("星期日:Calendar.SUNDAY=1");   
        System.out.println("星期一:Calendar.MONDAY=2");   
        System.out.println("星期二:Calendar.TUESDAY=3");   
        System.out.println("星期三:Calendar.WEDNESDAY=4");   
        System.out.println("星期四:Calendar.THURSDAY=5");   
        System.out.println("星期五:Calendar.FRIDAY=6");   
        System.out.println("星期六:Calendar.SATURDAY=7");   
        System.out.println("测试结果:" + c.get(Calendar.DAY_OF_WEEK));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.DAY_OF_WEEK_IN_MONTH");   
        System.out.println("代表含义:这一天所对应的星期几在该月中是第几次出现");   
        System.out.println("测试结果:" + c.get(Calendar.DAY_OF_WEEK_IN_MONTH));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.DAY_OF_YEAR");   
        System.out.println("代表含义:一年中的第几天");   
        System.out.println("测试结果:" + c.get(Calendar.DAY_OF_YEAR));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.HOUR");   
        System.out.println("代表含义:12小时制下的小时数,中午和午夜表示为0");   
        System.out.println("测试结果:" + c.get(Calendar.HOUR));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.HOUR_OF_DAY");   
        System.out.println("代表含义:24小时制下的小时数,午夜表示为0");   
        System.out.println("测试结果:" + c.get(Calendar.HOUR_OF_DAY));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.MILLISECOND");   
        System.out.println("代表含义:毫秒数");   
        System.out.println("测试结果:" + c.get(Calendar.MILLISECOND));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.MINUTE");   
        System.out.println("代表含义:分钟");   
        System.out.println("测试结果:" + c.get(Calendar.MINUTE));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.MONTH");   
        System.out.println("代表含义:月份,从0到11表示12个月份,比实际月份值小1");   
        System.out.println("测试结果:" + c.get(Calendar.MONTH));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.SECOND");   
        System.out.println("代表含义:秒");   
        System.out.println("测试结果:" + c.get(Calendar.SECOND));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.WEEK_OF_MONTH");   
        System.out.println("代表含义:一个月中的第几个星期");   
        System.out.println("测试结果:" + c.get(Calendar.WEEK_OF_MONTH));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.WEEK_OF_YEAR");   
        System.out.println("代表含义:一年中的第几个星期");   
        System.out.println("测试结果:" + c.get(Calendar.WEEK_OF_YEAR));   
        System.out.println();   
  
        System.out.println("属性名称:Calendar.YEAR");   
        System.out.println("代表含义:年份");   
        System.out.println("测试结果:" + c.get(Calendar.YEAR));   
    }   
 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class DateTest { 
/** 
* 以一种较为友好的方式格式化日期时间值 
* 
* @param c 
*            日期时间对象 
* @return 格式化后的日期时间字符串 
*/ 
public static String toFriendlyString(Calendar c) { 
if (c != null) { 
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss.SSS"); 
return df.format(c.getTime()); 
} 
return null; 
} 

public static void main(String[] args) { 
Calendar c = Calendar.getInstance(); 
System.out.println("当前时刻:" + DateTest.toFriendlyString(c)); 
System.out.println(); 

System.out.println("属性名称:Calendar.AM_PM"); 
System.out.println("代表含义:上下午标识,上午返回Calendar.AM=0,下午返回Calendar.PM=1"); 
System.out.println("测试结果:" + c.get(Calendar.AM_PM)); 
System.out.println(); 

System.out.println("属性名称:Calendar.DATE"); 
System.out.println("代表含义:一个月中的第几天,同Calendar.DAY_OF_MONTH"); 
System.out.println("测试结果:" + c.get(Calendar.DATE)); 
System.out.println(); 

System.out.println("属性名称:Calendar.DAY_OF_MONTH"); 
System.out.println("代表含义:一个月中的第几天,同Calendar.DATE"); 
System.out.println("测试结果:" + c.get(Calendar.DAY_OF_MONTH)); 
System.out.println(); 

System.out.println("属性名称:Calendar.DAY_OF_WEEK"); 
System.out.println("代表含义:一周中的第几天,对应星期几,第一天为星期日,于此类推。"); 
System.out.println("星期日:Calendar.SUNDAY=1"); 
System.out.println("星期一:Calendar.MONDAY=2"); 
System.out.println("星期二:Calendar.TUESDAY=3"); 
System.out.println("星期三:Calendar.WEDNESDAY=4"); 
System.out.println("星期四:Calendar.THURSDAY=5"); 
System.out.println("星期五:Calendar.FRIDAY=6"); 
System.out.println("星期六:Calendar.SATURDAY=7"); 
System.out.println("测试结果:" + c.get(Calendar.DAY_OF_WEEK)); 
System.out.println(); 

System.out.println("属性名称:Calendar.DAY_OF_WEEK_IN_MONTH"); 
System.out.println("代表含义:这一天所对应的星期几在该月中是第几次出现"); 
System.out.println("测试结果:" + c.get(Calendar.DAY_OF_WEEK_IN_MONTH)); 
System.out.println(); 

System.out.println("属性名称:Calendar.DAY_OF_YEAR"); 
System.out.println("代表含义:一年中的第几天"); 
System.out.println("测试结果:" + c.get(Calendar.DAY_OF_YEAR)); 
System.out.println(); 

System.out.println("属性名称:Calendar.HOUR"); 
System.out.println("代表含义:12小时制下的小时数,中午和午夜表示为0"); 
System.out.println("测试结果:" + c.get(Calendar.HOUR)); 
System.out.println(); 

System.out.println("属性名称:Calendar.HOUR_OF_DAY"); 
System.out.println("代表含义:24小时制下的小时数,午夜表示为0"); 
System.out.println("测试结果:" + c.get(Calendar.HOUR_OF_DAY)); 
System.out.println(); 

System.out.println("属性名称:Calendar.MILLISECOND"); 
System.out.println("代表含义:毫秒数"); 
System.out.println("测试结果:" + c.get(Calendar.MILLISECOND)); 
System.out.println(); 

System.out.println("属性名称:Calendar.MINUTE"); 
System.out.println("代表含义:分钟"); 
System.out.println("测试结果:" + c.get(Calendar.MINUTE)); 
System.out.println(); 

System.out.println("属性名称:Calendar.MONTH"); 
System.out.println("代表含义:月份,从0到11表示12个月份,比实际月份值小1"); 
System.out.println("测试结果:" + c.get(Calendar.MONTH)); 
System.out.println(); 

System.out.println("属性名称:Calendar.SECOND"); 
System.out.println("代表含义:秒"); 
System.out.println("测试结果:" + c.get(Calendar.SECOND)); 
System.out.println(); 

System.out.println("属性名称:Calendar.WEEK_OF_MONTH"); 
System.out.println("代表含义:一个月中的第几个星期"); 
System.out.println("测试结果:" + c.get(Calendar.WEEK_OF_MONTH)); 
System.out.println(); 

System.out.println("属性名称:Calendar.WEEK_OF_YEAR"); 
System.out.println("代表含义:一年中的第几个星期"); 
System.out.println("测试结果:" + c.get(Calendar.WEEK_OF_YEAR)); 
System.out.println(); 

System.out.println("属性名称:Calendar.YEAR"); 
System.out.println("代表含义:年份"); 
System.out.println("测试结果:" + c.get(Calendar.YEAR)); 
} 
} 

运行结果如下: 

当前时刻:2008年07月22日 13:16:07.421 

属性名称:Calendar.AM_PM 
代表含义:上下午标识,上午返回Calendar.AM=0,下午返回Calendar.PM=1 
测试结果:1 

属性名称:Calendar.DATE 
代表含义:一个月中的第几天,同Calendar.DAY_OF_MONTH 
测试结果:22 

属性名称:Calendar.DAY_OF_MONTH 
代表含义:一个月中的第几天,同Calendar.DATE 
测试结果:22 

属性名称:Calendar.DAY_OF_WEEK 
代表含义:一周中的第几天,对应星期几,第一天为星期日,于此类推。 
星期日:Calendar.SUNDAY=1 
星期一:Calendar.MONDAY=2 
星期二:Calendar.TUESDAY=3 
星期三:Calendar.WEDNESDAY=4 
星期四:Calendar.THURSDAY=5 
星期五:Calendar.FRIDAY=6 
星期六:Calendar.SATURDAY=7 
测试结果:3 

属性名称:Calendar.DAY_OF_WEEK_IN_MONTH 
代表含义:这一天所对应的星期几在该月中是第几次出现 
测试结果:4 

属性名称:Calendar.DAY_OF_YEAR 
代表含义:一年中的第几天 
测试结果:204 

属性名称:Calendar.HOUR 
代表含义:12小时制下的小时数,中午和午夜表示为0 
测试结果:1 

属性名称:Calendar.HOUR_OF_DAY 
代表含义:24小时制下的小时数,午夜表示为0 
测试结果:13 

属性名称:Calendar.MILLISECOND 
代表含义:毫秒数 
测试结果:421 

属性名称:Calendar.MINUTE 
代表含义:分钟 
测试结果:16 

属性名称:Calendar.MONTH 
代表含义:月份,从0到11表示12个月份,比实际月份值小1 
测试结果:6 

属性名称:Calendar.SECOND 
代表含义:秒 
测试结果:7 

属性名称:Calendar.WEEK_OF_MONTH 
代表含义:一个月中的第几个星期 
测试结果:4 

属性名称:Calendar.WEEK_OF_YEAR 
代表含义:一年中的第几个星期 
测试结果:30 

属性名称:Calendar.YEAR 
代表含义:年份 
测试结果:2008 

其中Calendar.DAY_OF_WEEK_IN_MONTH代表的含义比较难理解一些,它表示“这一天所对应的星期几在该月中是第几次出现”。比如2008年8月8日是星期五,在它之前的8月1日也是星期五,因此它是8月份的第二个星期五。所以这时调用get(Calendar.DAY_OF_WEEK_IN_MONTH)就会返回2。这里存在一个简单易记的规律:对于每月的 1-7号,它们一定占全了星期一到星期日,所以不管是它们中的哪一天,也不管这一天是星期几,它总是第一个,因此返回1;8-14号也同样占全了星期一到星期日,但由于1-7号的关系,对于它们总是返回2;以此类推,15-21号返回3,22-28号返回4,29-31号返回5。 

Calendar对象和Date对象可以通过Calendar类的如下两个方法进行相互转换: 
Java代码 
public final Date getTime() {   
    //other code   
}   
  
public final void setTime(Date date) {   
    //other code   
 

public final Date getTime() { 
    //other code 
} 

public final void setTime(Date date) { 
    //other code 
} 

日期格式化与解析 

我们回头再来看看在上面的例子中定义的toFriendlyString(Calendar c)方法,它将一个Calendar对象的日期时间值以一种很友好的方式来展现,使人们很容易看懂,也符合我们中国人的习惯。这完全得益于抽象类 DateFormat以及它的子类实体类SimpleDateFormat的帮助。这两个类都位于java.text包中,是专门用于日期格式化和解析的类。而这两项工作的核心就是我们为此设定的Pattern,我们可以称之为“日期格式表达式”。 

理论上讲日期格式表达式包含全部26个英文字母的大小写,不过它们中的一些字母只是被预留了,并没有确切的含义。目前有效的字母及它们所代表的含义如下: 

G:年代标识,表示是公元前还是公元后 
y:年份 
M:月份 
d:日 
h:小时,从1到12,分上下午 
H:小时,从0到23 
m:分钟 
s:秒 
S:毫秒 
E:一周中的第几天,对应星期几,第一天为星期日,于此类推    
z:时区 
D:一年中的第几天 
F:这一天所对应的星期几在该月中是第几次出现 
w:一年中的第几个星期 
W:一个月中的第几个星期 
a:上午/下午标识 
k:小时,从1到24 
K:小时,从0到11,区分上下午 

在日期格式表达式中出现的所有字母,在进行日期格式化操作后,都将被其所代表的含义对应的属性值所替换,并且对某些字母来说,重复次数的不同,格式化后的结果也会有所不同。请看下面的例子: 
Java代码 
import java.text.SimpleDateFormat;   
import java.util.Date;   
  
public class DateTest {   
    public static void main(String[] args) {   
        // 使用系统当前日期时间值创建一个Date对象   
        Date now = new Date();   
  
        // 创建一个日期格式表达式   
        String pattern = "年代:G;年份:y;月份:M;日:d;时(1~12):h;时(0~23):H;分:m;秒:s;毫秒:S;星期:E;上/下午:a;时区:z";   
        // 使用日期格式表达式创建一个SimpleDateFormat对象   
        SimpleDateFormat df = new SimpleDateFormat(pattern);   
        // 调用SimpleDateFormat类的format(Date date)方法对Date对象进行格式化,并返回格式化后的字符串。   
        // 该方法继承自java.text.DateFormat类   
        System.out.println("1位:" + df.format(now));   
  
        // 创建一个新的日期格式表达式   
        pattern = "年代:GG;年份:yy;月份:MM;日:dd;时(1~12):hh;时(0~23):HH;分:mm;秒:ss;毫秒:SS;星期:EE;上/下午:aa;时区:zz";   
        // 调用SimpleDateFormat的applyPattern(String pattern)方法用新创建的日期格式表达式替换其原有的   
        df.applyPattern(pattern);   
        System.out.println("2位:" + df.format(now));   
  
        pattern = "年代:GGG;年份:yyy;月份:MMM;日:ddd;时(1~12):hhh;时(0~23):HHH;分:mmm;秒:sss;毫秒:SSS;星期:EEE;上/下午:aaa;时区:zzz";   
        df.applyPattern(pattern);   
        System.out.println("3位:" + df.format(now));   
  
        pattern = "年代:GGGG;年份:yyyy;月份:MMMM;日:dddd;时(1~12):hhhh;时(0~23):HHHH;分:mmmm;秒:ssss;毫秒:SSSS;星期:EEEE;上/下午:aaaa;时区:zzzz";   
        df.applyPattern(pattern);   
        System.out.println("4位:" + df.format(now));   
  
        pattern = "年代:GGGGG;年份:yyyyy;月份:MMMMM;日:ddddd;时(1~12):hhhhh;时(0~23):HHHHH;分:mmmmm;秒:sssss;毫秒:SSSSS;星期:EEEEE;上/下午:aaaaa;时区:zzzzz";   
        df.applyPattern(pattern);   
        System.out.println("5位:" + df.format(now));   
  
        pattern = "年代:GGGGGG;年份:yyyyyy;月份:MMMMMM;日:dddddd;时(1~12):hhhhhh;时(0~23):HHHHHH;分:mmmmmm;秒:ssssss;毫秒:SSSSSS;星期:EEEEEE;上/下午:aaaaaa;时区:zzzzzz";   
        df.applyPattern(pattern);   
        System.out.println("6位:" + df.format(now));   
    }   
 

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DateTest { 
public static void main(String[] args) { 
// 使用系统当前日期时间值创建一个Date对象 
Date now = new Date(); 

// 创建一个日期格式表达式 
String pattern = "年代:G;年份:y;月份:M;日:d;时(1~12):h;时(0~23):H;分:m;秒:s;毫秒:S;星期:E;上/下午:a;时区:z"; 
// 使用日期格式表达式创建一个SimpleDateFormat对象 
SimpleDateFormat df = new SimpleDateFormat(pattern); 
// 调用SimpleDateFormat类的format(Date date)方法对Date对象进行格式化,并返回格式化后的字符串。 
// 该方法继承自java.text.DateFormat类 
System.out.println("1位:" + df.format(now)); 

// 创建一个新的日期格式表达式 
pattern = "年代:GG;年份:yy;月份:MM;日:dd;时(1~12):hh;时(0~23):HH;分:mm;秒:ss;毫秒:SS;星期:EE;上/下午:aa;时区:zz"; 
// 调用SimpleDateFormat的applyPattern(String pattern)方法用新创建的日期格式表达式替换其原有的 
df.applyPattern(pattern); 
System.out.println("2位:" + df.format(now)); 

pattern = "年代:GGG;年份:yyy;月份:MMM;日:ddd;时(1~12):hhh;时(0~23):HHH;分:mmm;秒:sss;毫秒:SSS;星期:EEE;上/下午:aaa;时区:zzz"; 
df.applyPattern(pattern); 
System.out.println("3位:" + df.format(now)); 

pattern = "年代:GGGG;年份:yyyy;月份:MMMM;日:dddd;时(1~12):hhhh;时(0~23):HHHH;分:mmmm;秒:ssss;毫秒:SSSS;星期:EEEE;上/下午:aaaa;时区:zzzz"; 
df.applyPattern(pattern); 
System.out.println("4位:" + df.format(now)); 

pattern = "年代:GGGGG;年份:yyyyy;月份:MMMMM;日:ddddd;时(1~12):hhhhh;时(0~23):HHHHH;分:mmmmm;秒:sssss;毫秒:SSSSS;星期:EEEEE;上/下午:aaaaa;时区:zzzzz"; 
df.applyPattern(pattern); 
System.out.println("5位:" + df.format(now)); 

pattern = "年代:GGGGGG;年份:yyyyyy;月份:MMMMMM;日:dddddd;时(1~12):hhhhhh;时(0~23):HHHHHH;分:mmmmmm;秒:ssssss;毫秒:SSSSSS;星期:EEEEEE;上/下午:aaaaaa;时区:zzzzzz"; 
df.applyPattern(pattern); 
System.out.println("6位:" + df.format(now)); 
} 
} 

输出结果如下: 

1位:年代:公元;年份:08;月份:7;日:22;时(1~12):3;时(0~23):15;分:17;秒:49;毫秒:187;星期:星期二;上/下午:下午;时区:CST 
2位:年代:公元;年份:08;月份:07;日:22;时(1~12):03;时(0~23):15;分:17;秒:49;毫秒:187;星期:星期二;上/下午:下午;时区:CST 
3位:年代:公元;年份:08;月份:七月;日:022;时(1~12):003;时(0~23):015;分:017;秒:049;毫秒:187;星期:星期二;上/下午:下午;时区:CST 
4位:年代:公元;年份:2008;月份:七月;日:0022;时(1~12):0003;时(0~23):0015;分:0017;秒:0049;毫秒:0187;星期:星期二;上/下午:下午;时区:中国标准时间 
5位:年代:公元;年份:02008;月份:七月;日:00022;时(1~12):00003;时(0~23):00015;分:00017;秒:00049;毫秒:00187;星期:星期二;上/下午:下午;时区:中国标准时间 
6位:年代:公元;年份:002008;月份:七月;日:000022;时(1~12):000003;时(0~23):000015;分:000017;秒:000049;毫秒:000187;星期:星期二;上/下午:下午;时区:中国标准时间 

如果我们想输出原始的字母,而不是它们所代表含义的替换值,就需要用单引号将它们包含在内,对于预留字母也是如此,虽然它们没有确切的含义。一对单引号可以一次包含多个字母,而两个连续的单引号将输出一个单引号结果,双引号则需要转义后输出。对于26个字母之外的字符,可以放在一对单引号中,也可以直接书写。请看下面的例子: 
Java代码 
import java.text.SimpleDateFormat;   
import java.util.Date;   
  
public class Test {   
    public static void main(String[] args) {   
        Date now = new Date();   
        SimpleDateFormat df = new SimpleDateFormat(   
                "'YEAR': yyyy 'MONTH:' ''MM'' 'DAY:' \"dd\" ");   
        System.out.println(df.format(now));   
    }   
 

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class Test { 
public static void main(String[] args) { 
Date now = new Date(); 
SimpleDateFormat df = new SimpleDateFormat( 
"'YEAR': yyyy 'MONTH:' ''MM'' 'DAY:' \"dd\" "); 
System.out.println(df.format(now)); 
} 
} 

运行结果: 

YEAR: 2008 MONTH: '07' DAY: "22" 

上面的一些例子中,我们将日期对象转换成一定格式的字符串输出,以得到符合我们习惯的较为友好的表现形式。我们还可以反过来,使用DateFormat类的parse(String source)方法将具有一定格式的字符串转换为一个Date对象,前提是我们利用前面讲到日期格式表达式语法为其找到一个合适的Pattern。例如: 
Java代码 
import java.text.ParseException;   
import java.text.SimpleDateFormat;   
import java.util.Date;   
  
public class DateTest {   
    public static void main(String[] args) throws ParseException {   
        String s = "2008-08-08";   
        System.out.println("原始字符串:" + s);   
        String pattern = "yyyy-MM-dd";   
        System.out.println("对应表达式:" + pattern);   
        SimpleDateFormat df = new SimpleDateFormat(pattern);   
        Date date = df.parse(s);   
        System.out.println("转换后的值:" + date);   
        System.out.println();   
  
        s = "05年2月12日 18:04:33";   
        System.out.println("原始字符串:" + s);   
        pattern = "yy年M月d日 HH:mm:ss";   
        System.out.println("对应表达式:" + pattern);   
        df.applyPattern(pattern);   
        date = df.parse(s);   
        System.out.println("转换后的值:" + date);   
        System.out.println();   
  
        s = "16/5/2004 20:7:2.050";   
        System.out.println("原始字符串:" + s);   
        pattern = "d/M/yyyy HH:m:s.SSS";   
        System.out.println("对应表达式:" + pattern);   
        df.applyPattern(pattern);   
        date = df.parse(s);   
        System.out.println("转换后的值:" + date);   
    }   
 

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DateTest { 
public static void main(String[] args) throws ParseException { 
String s = "2008-08-08"; 
System.out.println("原始字符串:" + s); 
String pattern = "yyyy-MM-dd"; 
System.out.println("对应表达式:" + pattern); 
SimpleDateFormat df = new SimpleDateFormat(pattern); 
Date date = df.parse(s); 
System.out.println("转换后的值:" + date); 
System.out.println(); 

s = "05年2月12日 18:04:33"; 
System.out.println("原始字符串:" + s); 
pattern = "yy年M月d日 HH:mm:ss"; 
System.out.println("对应表达式:" + pattern); 
df.applyPattern(pattern); 
date = df.parse(s); 
System.out.println("转换后的值:" + date); 
System.out.println(); 

s = "16/5/2004 20:7:2.050"; 
System.out.println("原始字符串:" + s); 
pattern = "d/M/yyyy HH:m:s.SSS"; 
System.out.println("对应表达式:" + pattern); 
df.applyPattern(pattern); 
date = df.parse(s); 
System.out.println("转换后的值:" + date); 
} 
} 

运行结果: 

原始字符串:2008-08-08 
对应表达式:yyyy-MM-dd 
转换后的值:Fri Aug 08 00:00:00 CST 2008 

原始字符串:05年2月12日 18:04:33 
对应表达式:yy年M月d日 HH:mm:ss 
转换后的值:Sat Feb 12 18:04:33 CST 2005 

原始字符串:16/5/2004 20:7:2.050 
对应表达式:d/M/yyyy HH:m:s.SSS 
转换后的值:Sun May 16 20:07:02 CST 2004 

分享到:
评论

相关推荐

    Java将日期类型Date时间戳转换为MongoDB的时间类型数据

    今天小编就为大家分享一篇关于Java将日期类型Date时间戳转换为MongoDB的时间类型数据,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Java中数据类型和MYSQL中数据类型的对比

    Java中数据类型和MYSQL中数据类型的对比 1、Java和MySQL数据类型参照图 2、MySQL数据类型分类 (1)数值 (2)日期/时间 (3)字符串(字符)类型。

    常用的java工具类:Date和String类型互转,获取想要格式的String类型的日期时间、java导出数据到Excel、http文件下载、HMAC-MD5加密、3DES加密、MD5加密、读写txt文件、zip解压缩文件、文件夹

    一些常用的java工具类:Date和String类型互转,获取想要格式的String类型的日期时间、java导出数据到Excel、http文件下载、HMAC-MD5加密、3DES加密、MD5加密、读写txt文件、zip解压缩文件、文件夹等

    Java读取Excel表格中的日期

    通过Java读取Excel文件中的数据时,需要自动判断当前Cell中的数据格式是否日期格式,如果是就要做特殊处理,以便读出数据的格式与预想的相符。

    详解 Java中日期数据类型的处理之格式转换的实例

    主要介绍了详解 Java中日期数据类型的处理之格式转换的实例的相关资料,日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar类和Date类,需要的朋友可以参考下

    JAVA String to Date 含Mon等缩写格式

    日期转换例子,支持含各种语言的三个字母缩写...适用于数据导入数据库String类型中含英文缩写转换,网上普遍使用的String to Date 都不适用含Mon Jul 等缩写,对比API,可以实现任意格式的String 类型转换成Date类型

    java与mysql日期类型的问题

    通过java向mysql中插入datetime类型的数据: String sql = "INSERT INTO wp_posts ( post_date )VALUES(?)"; PreparedStatement pstmt = connection.prepareStatement(sql); Timestamp time = new Timestamp...

    JsonObject转换Date日期

    JsonObject转换Date日期的时候出现问题解决date封装成json数据出现的问题

    Android-Java中的日期转化格式DateUtil工具类

    Java中的日期转化格式DateUtil工具类

    Java数据类型转换详解

    主要讲解Java中基本数据类型、字符串与其它数据类型以及常见的日期类型的转换,希望能给大家做一个参考。

    java处理日期、时间的类

    接受Calendar类型的日期数据,计算天数差 获取当前日期,格式化成yyyy-MM-dd 获取当前日期,格式化成yyyy-MM-dd HH:mm:ss 接受YYYY-MM-DD的日期字符串参数,返回两个日期相差的天数 接受Date类型的日期参数,返回两个...

    DataUtil--数据工具类--数据类型判断和比较

    DataUtil--数据工具类--数据类型判断和比较,包括判断字符串是否为空,判断字符串不为空,判断是否为数字,判断是否为整型数字,判断是否为日期字符串(格式如:2014-04-01),判断是否为时间字符串(格式如:2014-...

    JAVA_API1.6文档(中文)

    javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供...

    DB2数据库中的各数据类型

    DB2内置数据类型可以分成数值型(numeric)、字符串型(character string)、图形字符串(graphic string)、二进制字符串型(binary string)或日期时间型(datetime)。还有一种叫做 DATALINK 的特殊数据类型。...

    JAVA上百实例源码以及开源项目源代码

    Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择  Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  ...

    Java相关思维导图.zip

    22、java日期时间 23、java流(Stream)、文件(File)和IO 24、java异常处理 25、java数据结构 26、java集合框架 27、java泛型 28、java序列化 29、java网络编程 30、java多线程 31、java8新特性 附加: linux命令 数据...

    java源码包---java 源码 大量 实例

    Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择  Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  ...

    C++转JAVA入门总结

    1. 内置数据类型 2. string类 3. 数组 4. 循环分支 5. 工具类(数据容器、日期、正则表达式……) 6. JAVA流、文件、IO 7. JAVA异常 8. JAVA继承 1. 抽象类与抽象方法 2. JAVA接口 3. JAVA泛型编程 4. JAVA序列化 5....

    java 各种测试数据的随机生成器,.rar

    可以集成到各种类型的java项目中使用。 优点 非常轻量级(不到1M),容易集成,无需过多第三方依赖 简单方便,无需编写冗余代码 生成的随机数据比较接近真实数据 支持的随机数据类型 日期时间 随机日期 随机时间 随机...

    日期,日期时间类型数据格式校验

    NULL 博文链接:https://xuechenyoyo.iteye.com/blog/723594

Global site tag (gtag.js) - Google Analytics