首页编程java编程java date 为什么过时?Java中,为什么Date类被Calendar类取代了

java date 为什么过时?Java中,为什么Date类被Calendar类取代了

编程之家2023-10-13122次浏览

大家好,今天小编来为大家解答java date 为什么过时这个问题,Java中,为什么Date类被Calendar类取代了很多人还不知道,现在让我们一起来看看吧!

java date 为什么过时?Java中,为什么Date类被Calendar类取代了

Java中,为什么Date类被Calendar类取代了

使用Java中的Date和Calendar类2008-05-25 21:13Java语言的Calendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.日期是商业逻辑计算一个关键的部分.所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象.我们写了两篇文章,这是第一篇,我们将大概的学习日期,日期格式,日期的解析和日期的计算.

我们将讨论下面的类:

1、具体类(和抽象类相对)java.util.Date

java date 为什么过时?Java中,为什么Date类被Calendar类取代了

2、抽象类java.text.DateFormat和它的一个具体子类,java.text.SimpleDateFormat

3、抽象类java.util.Calendar和它的一个具体子类,java.util.GregorianCalendar

具体类可以被实例化,但是抽象类却不能.你首先必须实现抽象类的一个具体子类.

java date 为什么过时?Java中,为什么Date类被Calendar类取代了

Date类从Java开发包(JDK) 1.0就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法,比如说月,日,和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,我们将在本文中进一步讨论它.这种改进旨在更好的处理日期数据的国际化格式.就象在JDK 1.1中一样, Date类实际上只是一个包裹类,它包含的是一个长整型数据,表示的是从GMT(格林尼治标准时间)1970年, 1月 1日00:00:00这一刻之前或者是之后经历的毫秒数.

一、创建一个日期对象

让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.这个时间通常被称为Java虚拟机(JVM)主机环境的系统时间.

import java.util.Date;

public class DateExample1{

public static void main(String[] args){

// Get the system date/time

Date date= new Date();

System.out.println(date.getTime());

}

}

在星期六, 2001年9月29日,下午大约是6:50的样子,上面的例子在系统输出设备上显示的结果是 1001803809710.在这个例子中,值得注意的是我们使用了Date构造函数创建一个日期对象,这个构造函数没有接受任何参数.而这个构造函数在内部使用了System.currentTimeMillis()方法来从系统获取日期.

那么,现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了.我们如何才能以一种用户明白的格式来显示这个日期呢?在这里类java.text.SimpleDateFormat和它的抽象基类 java.text.DateFormat就派得上用场了.

二、日期数据的定制格式

假如我们希望定制日期数据的格式,比方星期六-9月-29日-2001年.下面的例子展示了如何完成这个工作:

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateExample2{

public static void main(String[] args){

SimpleDateFormat bartDateFormat=

new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

Date date= new Date();

System.out.println(bartDateFormat.format(date));

}

}

只要通过向SimpleDateFormat的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",我们就能够指明自己想要的格式.你应该可以看见,格式字符串中的ASCII字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年.字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01.请察看Sun公司的Web站点获取日期格式化选项的完整的指示.

三、将文本数据解析成日期对象

假设我们有一个文本字符串包含了一个格式化了的日期对象,而我们希望解析这个字符串并从文本日期数据创建一个日期对象.我们将再次以格式化字符串"MM-dd-yyyy"调用SimpleDateFormat类,但是这一次,我们使用格式化解析而不是生成一个文本日期数据.我们的例子,显示在下面,将解析文本字符串"9-29-2001"并创建一个值为001736000000的日期对象.

例子程序:

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateExample3{

public static void main(String[] args){

// Create a date formatter that can parse dates of

// the form MM-dd-yyyy.

SimpleDateFormat bartDateFormat=

new SimpleDateFormat("MM-dd-yyyy");

// Create a string containing a text date to be parsed.

String dateStringToParse="9-29-2001";

try{

// Parse the text version of the date.

// We have to perform the parse method in a

// try-catch construct in case dateStringToParse

// does not contain a date in the format we are expecting.

Date date= bartDateFormat.parse(dateStringToParse);

// Now send the parsed date as a long value

// to the system output.

System.out.println(date.getTime());

}

catch(Exception ex){

System.out.println(ex.getMessage());

}

}

}

五、使用标准的日期格式化过程

既然我们已经可以生成和解析定制的日期格式了,让我们来看一看如何使用内建的格式化过程.方法 DateFormat.getDateTimeInstance()让我们得以用几种不同的方法获得标准的日期格式化过程.在下面的例子中,我们获取了四个内建的日期格式化过程.它们包括一个短的,中等的,长的,和完整的日期格式.

import java.text.DateFormat;

import java.util.Date;

public class DateExample4{

public static void main(String[] args){

Date date= new Date();

DateFormat shortDateFormat=

DateFormat.getDateTimeInstance(

DateFormat.SHORT,

DateFormat.SHORT);

DateFormat mediumDateFormat=

DateFormat.getDateTimeInstance(

DateFormat.MEDIUM,

DateFormat.MEDIUM);

DateFormat longDateFormat=

DateFormat.getDateTimeInstance(

DateFormat.LONG,

DateFormat.LONG);

DateFormat fullDateFormat=

DateFormat.getDateTimeInstance(

DateFormat.FULL,

DateFormat.FULL);

System.out.println(shortDateFormat.format(date));

System.out.println(mediumDateFormat.format(date));

System.out.println(longDateFormat.format(date));

System.out.println(fullDateFormat.format(date));

}

}

注意我们在对 getDateTimeInstance的每次调用中都传递了两个值.第一个参数是日期风格,而第二个参数是时间风格.它们都是基本数据类型int(整型).考虑到可读性,我们使用了DateFormat类提供的常量: SHORT, MEDIUM, LONG,和 FULL.要知道获取时间和日期格式化过程的更多的方法和选项,请看Sun公司Web站点上的解释.

运行我们的例子程序的时候,它将向标准输出设备输出下面的内容:

9/29/01 8:44 PM

Sep 29, 2001 8:44:45 PM

September 29, 2001 8:44:45 PM EDT

Saturday, September 29, 2001 8:44:45 PM EDT

六、Calendar类

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟?我们又如何在日期的这些部分加上或者减去值呢?答案是使用Calendar类.就如我们前面提到的那样, Calendar类中的方法替代了Date类中被人唾骂的方法.

假设你想要设置,获取,和操纵一个日期对象的各个部分,比方一个月的一天或者是一个星期的一天.为了演示这个过程,我们将使用具体的子类 java.util.GregorianCalendar.考虑下面的例子,它计算得到下面的第十个星期五是13号.

import java.util.GregorianCalendar;

import java.util.Date;

import java.text.DateFormat;

public class DateExample5{

public static void main(String[] args){

DateFormat dateFormat=

DateFormat.getDateInstance(DateFormat.FULL);

// Create our Gregorian Calendar.

GregorianCalendar cal= new GregorianCalendar();

// Set the date and time of our calendar

// to the system's date and time

cal.setTime(new Date());

System.out.println("System Date:"+

dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY

cal.set(GregorianCalendar.DAY_OF_WEEK,

GregorianCalendar.FRIDAY);

System.out.println("After Setting Day of Week to Friday:"+

dateFormat.format(cal.getTime()));

int friday13Counter= 0;

while(friday13Counter<= 10){

// Go to the next Friday by adding 7 days.

cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

// If the day of month is 13 we have

// another Friday the 13th.

if(cal.get(GregorianCalendar.DAY_OF_MONTH)== 13){

friday13Counter++;

System.out.println(dateFormat.format(cal.getTime()));

}

}

}

}

在这个例子中我们作了有趣的函数调用:

cal.set(GregorianCalendar.DAY_OF_WEEK,

GregorianCalendar.FRIDAY);

和:

cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

set方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五.注意到这里我们使用了常量 DAY_OF_WEEK和 FRIDAY来增强代码的可读性. add方法让我们能够在日期上加上数值.润年的所有复杂的计算都由这个方法自动处理.

我们这个例子的输出结果是:

System Date: Saturday, September 29, 2001

当我们将它设置成星期五以后就成了: Friday, September 28, 2001

Friday, September 13, 2002

Friday, December 13, 2002

Friday, June 13, 2003

Friday, February 13, 2004

Friday, August 13, 2004

Friday, May 13, 2005

Friday, January 13, 2006

Friday, October 13, 2006

Friday, April 13, 2007

Friday, July 13, 2007

Friday, June 13, 2008

为什么java的Date类无法设置1900年以前的日期,大神帮帮忙!

//条条大路通罗马啊.哈...我刚才整理一下,几种方法,可以参考一下,有可能还有其他更好的呢

importjava.text.*;

importjava.util.*;

publicclassCalTest{

publicstaticvoidmain(String[]args){

//方法1:创建

Calendarcd=newGregorianCalendar(1800,4,1);

Stringstr=newSimpleDateFormat("y年M月d日E").format(cd.getTime());

System.out.println("方法1获取:"+str);

//方法2:设置

cd=Calendar.getInstance();

cd.set(1800,4,1);

str=DateFormat.getDateInstance(DateFormat.FULL).format(cd.getTime());

System.out.println("方法2获取:"+str);

//方法3:偏移

cd=Calendar.getInstance();

cd.add(Calendar.YEAR,1800-cd.get(Calendar.YEAR));

str=DateFormat.getDateInstance(DateFormat.FULL).format(cd.getTime());

System.out.println("方法3获取:"+str);

//方法4:过时了但是能用;

str=DateFormat.getDateInstance(DateFormat.FULL).format(newDate(1800-1900,04,01));

System.out.println("方法4获取:"+str);

}

}

//你所说的应该是我整理的方法4那样的,用方法3吧这个最灵活了..

java中的Date类为什么很多方法被废弃了

Date类中有很多方法都标有删除线,是因为Date类在设计中有很多问题,如getYear指的是1900年以来的年数,getMonth是从0开始的。事实上,不止Date类,Java的其实时间相关类都存在设计问题,以下举些例子,并提供解决方案。

我们通常使用 Date和Calander用作时间处理,其实会有两个问题:

1.Date的缺陷,我们知道 Date的setYear和getYear等函数是删除线显示的

原因在:比如今天是2009-01-04日,那么获取的年竟然是109,所以是有问题的

2.Calender常常用于时间的回卷,经常使用的就是roll(Day_of_Year,-7)就是七天前

但是如果是2009-01-04日,那么七天前是2009-12-28日,而非2008年,这是因为它只对天回卷了,年没有回卷

3、针对这些问题,提供一套日期工具类:

import org.apache.log4j.Logger;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

public class AdDateUtil{

private static Logger logger= Logger.getLogger(AdDateUtil.class);

static public String getNowStr(String format){

SimpleDateFormat sdf= new SimpleDateFormat(format);

String now= sdf.format(new Date());

return now;

}

static public Date getFormatDate(String date, String format){

SimpleDateFormat sdf= new SimpleDateFormat(format);

Date d= new Date();

try{

d= sdf.parse(date);

} catch(ParseException e){

logger.error(e);

}

return d;

}

static public String getDateStr(Date date, String format){

SimpleDateFormat sdf= new SimpleDateFormat(format);

String d= sdf.format(date);

return d;

}

static public String getPadZeroString(String s, int size){

StringBuffer sb= new StringBuffer();

for(int i= 0; i<(size- s.length()); i++){

sb.append("0");

}

sb.append(s);

return sb.toString();

}

/**

*得到某月的天数

*

*@param year

*@param month

*@return

*/

static public int getDayCountOfMonth(String year, String month){

Calendar cal= Calendar.getInstance();

//年

cal.set(Calendar.YEAR, Integer.parseInt(year));

//月,因为Calendar里的月是从0开始,所以要-1

cal.set(Calendar.MONTH, Integer.parseInt(month)- 1);

return cal.getActualMaximum(Calendar.DAY_OF_MONTH);

}

static public String getYesterday(String format){

SimpleDateFormat df= new SimpleDateFormat(format);

Calendar now= Calendar.getInstance();

now.roll(Calendar.DAY_OF_YEAR,-1);//昨天

return df.format(now.getTime());

}

/**

*获取和今天附近的某天

*@param format

*@param diff

*@return

*/

static public String getADay(String format, int diff){

SimpleDateFormat df= new SimpleDateFormat(format);

Calendar now= Calendar.getInstance();

int beforeM= now.get(Calendar.MONTH);

now.roll(Calendar.DAY_OF_YEAR, diff);//

int nowM= now.get(Calendar.MONTH);

//必须进行日期处理,否则2009-01-04日前七天是2009-12-28

if(nowM> beforeM){

now.roll(Calendar.YEAR,-1);

}

return df.format(now.getTime());

}

static public String getTomorrow(String format){

SimpleDateFormat df= new SimpleDateFormat(format);

Calendar now= Calendar.getInstance();

now.roll(Calendar.DAY_OF_YEAR, 1);//明天

return df.format(now.getTime());

}

/**

*得到最近num天的全部日期

*说明:

* 1.日期是从昨天开始算的.

* 2.如果num=2,日期是2008-03-14,则返回的结果为 2008-03-12、2008-03-13

*@param num

*@return

*/

public static String[] getDaysByNum(int num, String date){

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

String[] result={};

Calendar cal= Calendar.getInstance();

cal.setTime(getDateFromString(date,"yyyy-MM-dd"));

//最近一周

result= new String[num];

for(int i= num; i> 0; i--){

cal.add(Calendar.DAY_OF_YEAR,-1);

result[i- 1]= sdf.format(new Date(cal.getTimeInMillis()));

}

return result;

}

public static Date getDateFromString(String dateStr, String format){

if((dateStr== null)||(format== null)){

try{

throw new Exception("数据类型异常"+ dateStr+"|"+ format);

} catch(Exception e){

logger.error("数据类型异常:"+ e);

}

}

SimpleDateFormat df= new SimpleDateFormat(format);

Date date;

try{

date= df.parse(dateStr);

return date;

} catch(Exception ex){

logger.error(ex);

return new Date();

}

}

static public int getNowYear(){

Calendar cal= Calendar.getInstance();

return cal.get(Calendar.YEAR);

}

static public int getNowMonth(){

Calendar cal= Calendar.getInstance();

return cal.get(Calendar.MONTH)+ 1;

}

public static String[] getMonthRang(String year, String month){

String beginDate= year+"-"+ month+"-01";

String endDate= year+"-"+ month+"-"+

getDayCountOfMonth(year, month);

return getDaysByRang(beginDate, endDate);

}

public static String[] getDaysByRang(String beginDate, String endDate){

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

//得到两个日期间相差多少天

int num= dateDiff(beginDate, endDate);

if(num< 0){

//颠倒一下日期

String tmp= beginDate;

beginDate= endDate;

endDate= tmp;

num= 0- num;

}

String[] result={};

Calendar cal= Calendar.getInstance();

try{

cal.setTime(sdf.parse(beginDate));

} catch(ParseException e){

e.printStackTrace();

}

num= num+ 1;//把开始和结束日期都包含进去

result= new String[num];

for(int i= 0; i< num; i++){

if(i> 0){

cal.add(Calendar.DAY_OF_YEAR, 1);

}

result[i]= sdf.format(new Date(cal.getTimeInMillis()));

}

return result;

}

public static int dateDiff(String beginDate, String endDate){

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

Date date= null;

try{

date= sdf.parse(endDate);

} catch(ParseException e){

date= new Date();

e.printStackTrace();

}

long end= date.getTime();

try{

date= sdf.parse(beginDate);

} catch(ParseException e){

date= new Date();

e.printStackTrace();

}

long begin= date.getTime();

long day=(end- begin)/(1000* 3600* 24);//除1000是把毫秒变成秒

return Integer.parseInt(Long.toString(day));

}

public static void main(String[] args){

System.out.println(AdDateUtil.getADay("yyyy-MM-dd",-7));

}

}

关于java date 为什么过时和Java中,为什么Date类被Calendar类取代了的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

为什么java线程不能重复start?Java线程的start方法能调用多次吗java_home是什么意思,%java_home %什么意思