1、 Date类中常用方法
1. Date类的常用方法
Date类的常用方法
方法 | 含义 |
new Date() | 实例化Date对象,常见于获得系统当前时间 |
new Date(long time) | 实例化Date对象,并根据具体的时间偏移量time设置时间 |
boolean after(Date when) | 测试此日期是否在指定日期之后 |
boolean before(Date when) | 测试此日期是否在指定日期之前 |
int compareTo(Date anotherDate) | 比较两个日期的顺序。如果参数 Date 等于此 Date,则返回值 0;如果此 Date 在 Date 参数之前,则返回小于 0 的值;如果此 Date 在 Date 参数之后,则返回大于 0 的值。 |
boolean equals(Object obj) | 比较两个日期的相等性。 |
【例1-17】Date类常用方法练习
public class TestDate {
public static void main(String[] args) {
Date now = new Date();//获取当前系统时间
System.out.println(now); //获取1970年1月1日1000毫秒之后的时间
Date d1 = new Date(1000);
System.out.println(now.after(d1));
System.out.println(now.before(d1));
System.out.println(now.compareTo(d1));
}
}
程序运行结果:
true
false
1
Date类不支持国际化。现在我们更应该多使用Calendar类来实现日期和时间字段之间转换,使用DateFormat类来格式化和分析日期字符串,而Date中的相应方法已废弃。
2. Calender类
由于Date类的设计目的更多的是偏向于寻求一种简单的方式表达时间,所以从JDK1.1版本开始,在处理日期和时间时,系统推荐使用相对复杂、功能完备的Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些,下面就介绍一下Calendar类的使用。
java.util.Calendar是一个抽象的基类,创建对象需要使用静态方法Calendar.getInstance()完成。通过Calendar对象可以获得详细的日历信息,例如年、月、日、小时、分和秒,Calendar的子类可以实现特定的日历系统。
1、使用Calendar类代表当前时间
Calendar c = Calendar.getInstance();
由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance()方法用来创建对象。
使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。
2、使用Calendar类代表指定的时间
Calendar c1 = Calendar.getInstance();
c1.set(2009, 3 - 1, 9);
使用Calendar类代表指定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
set()方法的声明为:
public final void set(int year, int month, int date)
以上示例代码设置的时间为2009年3月9日,其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。如果只设定某个字段,例如日期的值,则可以使用如下set()方法:
public void set(int field, int value)
在该方法中,参数field代表要设置的字段的类型,常见类型如下:
Calendar.YEAR——年份
Calendar.MONTH——月份
Calendar.DATE——日期
Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
Calendar.HOUR——12小时制的小时数
Calendar.HOUR_OF_DAY——24小时制的小时数
Calendar.MINUTE——分钟
Calendar.SECOND——秒
Calendar.DAY_OF_WEEK——星期几
后续的参数value代表,设置成的值。例如:
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.DATE,10);
该代码的作用是将c1对象代表的时间中日期设置为10号,其它所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。
3、从Calendar对象中获得信息
使用Calendar类中的get()方法可以获得Calendar对象中对应的信息,
get()方法的声明如下:
public int get(int field);
其中参数field代表需要获得的字段的值,字段说明和上面的set()方法保持一致。需要说明的是,获得的月份为实际的月份值减1,获得的星期的值和Date类不一样。在Calendar类中,周日是1,周一是2,周二是3,依次类推。
Calendar c2 = Calendar.getInstance();
int year = c2.get(Calendar.YEAR); //年份
int month = c2.get(Calendar.MONTH) + 1; //月份
int date = c2.get(Calendar.DATE); //日期
int hour = c2.get(Calendar.HOUR_OF_DAY); //小时
int minute = c2.get(Calendar.MINUTE); //分钟
int second = c2.get(Calendar.SECOND); //秒
int day = c2.get(Calendar.DAY_OF_WEEK); //星期几
System.out.println("年份:" + year);
System.out.println("月份:" + month);
System.out.println("日期:" + date);
System.out.println("小时:" + hour);
System.out.println("分钟:" + minute);
System.out.println("秒:" + second);
System.out.println("星期:" + day);
4、其它方法说明
Calendar类中还提供了很多其它有用的方法,下面简单的介绍几个常见方法的使用。
(1) add()方法
public abstract void add(int field,int amount)
该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加时amount的值为正,减少时amount的值为负。
例如,计算一下当前时间100天以后的日期,代码如下:
Calendar c3 = Calendar.getInstance();
c3.add(Calendar.DATE, 100);
int year1 = c3.get(Calendar.YEAR);
int month1 = c3.get(Calendar.MONTH) + 1; //月份
int date1 = c3.get(Calendar.DATE); //日期
System.out.println(year1 + "年" + month1 + "月" + date1 + "日");
这里add()方法是指在c3对象的Calendar.DATE,也就是日期字段上增加100,类内部会重新计算该日期对象中其它各字段的值,从而获得100天以后的日期,例如若当前时间为2015年8月7日,则程序的输出结果为:2015年11月15日
(2) after()方法
public boolean after(Object when)
该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。例如:
Calendar c4 = Calendar.getInstance();
c4.set(2009, 10 - 1, 10);
Calendar c5 = Calendar.getInstance();
c5.set(2010, 10 - 1, 10);
boolean b = c5.after(c4);
System.out.println(b);
在该示例代码中对象c4代表的时间是2009年10月10号,对象c5代表的时间是2010年10月10号,则对象c5代表的日期在c4代表的日期之后,所以after()方法的返回值是true。
另外一个类似的方法是before(),该方法是判断当前日期对象是否位于另外一个日期对象之前。
(3) getTime()方法
public final Date getTime()
该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。
类似的方法是setTime(),该方法的作用是将Date对象转换为对应的Calendar对象,该方法的声明如下:
public final void setTime(Date date)
转换的示例代码如下:
Date d = new Date();
Calendar c6 = Calendar.getInstance();
//Calendar类型的对象转换为Date对象
Date d1 = c6.getTime();
//Date类型的对象转换为Calendar对象
Calendar c7 = Calendar.getInstance();
c7.setTime(d);
5、Calendar对象和相对时间之间的互转
Calendar c8 = Calendar.getInstance();
long t = 1252785271098L;
//将Calendar对象转换为相对时间
long t1 = c8.getTimeInMillis();
//将相对时间转换为Calendar对象
Calendar c9 = Calendar.getInstance();
c9.setTimeInMillis(t1);
在转换时,使用Calendar类中的getTimeInMillis()方法可以将Calendar对象转换为相对时间。在将相对时间转换为Calendar对象时,首先创建一个Calendar对象,然后再使用Calendar类的setTimeInMillis()方法设置时间即可。
3. Calendar 类常用属性
Calendar类的常用属性
属性 | 含义 |
public final static int HOUR | 小时时间 |
public final static int MINUTE | 分时间 |
public final static int SECOND | 秒时间 |
public final static int DATE | 日期的Date部分 |
public final static int MONTH | 日期的Month部分 |
public final static int YEAR | 日期的年部分 |
【例】Calendar类使用练习
public class TestCalendar {
public static void main(String[] args) {
//获取Calendar类的实例
Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.YEAR)+"年"+
(c.get(Calendar.MONTH)+1)+"月"+
c.get(Calendar.DAY_OF_MONTH)+"日");
//设置指定时间
c.set(2011,10,11);
System.out.println(c.get(Calendar.YEAR)+"年"+ (c.get(Calendar.MONTH)+1)+"月"+
c.get(Calendar.DAY_OF_MONTH)+"日");
Calendar c1 = Calendar.getInstance();
Calendar c3 = Calendar.getInstance();
c3.add(Calendar.DATE, 100);
int year1 = c3.get(Calendar.YEAR);
int month1 = c3.get(Calendar.MONTH) + 1; //月份
int date1 = c3.get(Calendar.DATE); //日期
System.out.println(year1 + "年" + month1 + "月" + date1 + "日");
}
}
程序分析:本例使用时间和日期处理方法进行计算。该程序实现的原理为:首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可获得对应的天数。
【例】输出当前月的月历,该示例的功能是输出当前系统时间所在月的日历,例如当前系统时间是2009年3月10日,则输出2009年3月的日历。
import java.util.Calendar;
public class DateExample2{
public static void main(String[] args){
//获得当前时间
Calendar c = Calendar.getInstance();
//设置代表的日期为1号
c.set(Calendar.DATE,1);
//获得1号是星期几
int start = c.get(Calendar.DAY_OF_WEEK);
//获得当前月的最大日期数
int maxDay = c.getActualMaximum(Calendar.DATE);
//输出标题
System.out.println("星期日星期一星期二星期三星期四星期五星期六");
//输出开始的空格
for(int i = 1;i < start;i++){
System.out.print(" ");
}
//输出该月中的所有日期
for(int i = 1; i <= maxDay; i++){
//输出日期数字
System.out.print(" " + i);
//输出分隔空格
System.out.print(" ");
if(i < 10){
System.out.print(' ');
}
//判断是否换行
if((start + i - 1) % 7 == 0){
System.out.println();
}
}
//换行
System.out.println();
}
}
程序运行结果:
程序分析:该程序实现的原理为:首先获得该月1号是星期几,然后获得该月的天数,最后使用流程控制实现按照日历的格式进行输出即可。即如果1号是星期一,则打印一个单位的空格,如果1号是星期二,则打印两个单位的空格,依次类推。打印完星期六的日期以后,进行换行。
4. SimpleDateFormat类的使用
java.text.SimpleDateFormat是一个以与语言环境相关的方式来格式化和分析日期的具体类,是抽象类java.text.DateFormat类的子类.
SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式,获取SimpleDateFormat的实例如下:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
上面代码确立了转换的格式,yyyy是完整的西元年,MM是月份,dd是日期,HH:mm:ss分别是小时、分和秒。至于为什么有的格式大写,有的格式小写,那是怕避免混淆,例如MM是月份,mm是分;HH是24小时制,而hh是12小时制,下表列出了SimpleDateFormat类中的模式字母。
SimpleDateFormat类中的模式字母
字母 | 日期或时间元素 |
y | 年 |
M | 年中的月份 |
d | 月份中的天数 |
E | 星期中的天数 |
a | Am/pm 标记 |
H | 一天中的小时数(0-23) |
h | am/pm 中的小时数(1-12) |
m | 小时中的分钟数 |
s | 分钟中的秒数 |
S | 毫秒数 |
1.字符串转日期:
字符串"2002-10-8 15:30:22",如果要把它转成日期,可以用以下代码:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse("2002-10-8 15:30:22");
2.日期转字符串:
假如把今天的日期转成字符串可用
String datestr=sdf.format(new Date());
这个字符串的内容便类似2002-10-08 14:55:38
透过这个API我们便可以随心所欲的将日期转成我们想要的字符串格式,例如希望将日期输出成2002年10月08日,可以这么写:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
String dateStr=sdf.format(new Date());
dateStr便会依照我们设定的格式输出。
【例】SimpleDateFormat的使用。
public class TestDateFormat {
public static void main(String[] args) {
//获取指定日期格式的SimpleFormat实例 1999年09月09日 12:12:12
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //获取指定日期的格式化字符串
String nowStr = sdf.format(new Date());
System.out.println(nowStr);
//将格式化的字符串转换成日期
try {
Date d = sdf.parse("2011-11-11 11:11:11");
System.out.println(d);
} catch (ParseException e) {
System.out.println("输入的字符串不符合日期的格式");
e.printStackTrace();
}
}
}