时间是一个一维概念,将其类比在一维坐标系上可以得出两个关键点,即坐标的零点位置以及坐标的刻度单位。在计算机中,以1970年1月1日 00:00:00,作为时间的原点,往前用负数表示,往后用正数表示,比如现在的时间就应该用正数表示。在计算机中,时间的刻度单位是毫秒(一毫秒是一秒的千分之一),因此在没有对时间格式做出规定的时候,对时间的表述就是一个表示毫秒的数字。在电脑中一般用long类型的数字表示时间的毫秒数,根据计算结果可以表示的时间范围大概是从零点位置开始前后2.9亿年。
Date类
java中的Date类是在包java.util.Date包下的类,这个类中的对象表示的是一个特定的精确到毫秒的时间,在这个类中常用的方法有Date()以及Date(long date),这两个方法的区别就在于是否传入参数,因此Date()方法表示的是系统的当前时间,这个当前时间会根据系统的不同而不同,比如如果当前电脑没有联网,显示的时间出错,那么Date()方法表示的时间也是错的。而Date(long date)表示的是传入参数的时间。除了这两个方法外,java中还提供了一个currentTimeMillis()方法用于获取系统的当前时间,这里要注意这个方法与Date()方法的不同之处,虽然二者获取的都是系统当前的时间,但是Date()方法返回的是正常格式的时间,但是currentTimeMillis()方法返回的是毫秒表示的时间。
演示代码1
package cn.date.demo;
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Long a = Long.MAX_VALUE;
System.out.println(a);
long y = a/(1000L*60*60*24*365);
System.out.println("还可以表示"+y+"年");
long nowTime = System.currentTimeMillis();//表示系统现在的时间
System.out.println(nowTime);
Date d1 = new Date();//没有传参代表当前时刻
System.out.println(d1);
System.out.println(d1.getTime());
System.out.println("________________________");
Date d2 = new Date(1000l*3600*24*365*2);//从1970年开始计数
System.out.println(d2);
}
}
DateFormat类和SimpleDateFormat类
在一个系统中,不同的人输入的时间格式是不一样的,比如中国人喜欢用年月日的方式来表示时间,但是西方人除了表示时间的文字和我们不一样外,在时间顺序上也会做出改变,比如他们更习惯把年放在后面。那么要怎么解决不同的人对同一个时间的输入不同的问题呢?或者说,如何实现时间对象与不同格式之间的字符串的转换问题呢?为此java中定义了一个抽象类DateFormat来规定了时间对象与不同格式字符串之间的转换,而SimpleDateFormat正是这个抽象类的子类。
当我们使用SimpleDateFormat类来创建对象时会要求我们输入时间格式,这里的时间格式一般为:"yyyy-MM-dd hh:mm:ss",其中yyyy代表year,MM代表Month,dd代表day,hh代表hour,mm代表minute,ss代表second。这里要注意,在输入时间格式的时候,以上几个有代表意义的符号是不能做出改变的,但是它们之间的连接符号可以做出改变,比如在演示代码2中,被注释的部分采用的时间格式是可以使用的。
在这个类中涉及到两个常用方法,分别是parse()将字符串转换为时间对象以及format()将时间对象转换为指定的字符串格式。这两个方法都要通过对象来调用,因此在parse()中传入字符串对象时传入的字符串格式必须与定义对象时的字符串格式一致。
演示代码2
package cn.date.demo;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;
/**
* 测试时间对象和字符串的相互转换
* 使用:抽象类:DateFormat 实现类:SimpleDateFormat
*/
public class TestDateFormate {
public static void main(String[] args) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//
// DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
//将字符串转为Date对象
//Date d1 = df.parse("2022年3月19日 20时10分22秒");
Date d1 = df.parse("2022-3-19 20:10:22");
System.out.println(d1.getTime());
//将Date对象转换为字符
Date d2 = new Date();
String str = df.format(d2);
System.out.println(str);
DateFormat df2 = new SimpleDateFormat("今年的第w个周中的E,今年的第D天");
System.out.println(df2.format(d2));
SimpleDateFormat df3 = new SimpleDateFormat("今天是"+"yyyy年MM月dd日");
Date d3 = new Date();
System.out.println(df3.format(d3));
}
}
Calendar类
Calendar类是一个抽象类,它定义的是有关日期计算的相关内容,它的一个具体子类是GregorianCalendar类,在这个类中提供了绝大多数国家或者地区使用的标准日历系统。在这个类中表示月份时用的是数字[0,11],其中0表示一月份,1表示二月份,2表示三月份……以此类推。而表示星期时是从周日开始计算的,因为西方国家的文化中周日才是一个星期的开始。
除了以上需要注意的常识之外,本类涉及的方法比较简单,只需参考演示代码的使用即可。
演示代码3
package cn.date.demo;
/**
* Calender是一个抽象类,为我们提供了关于日期计算的相关功能,
* GregorianCalendar是Calender的一个具体子类,提供了世界上大多数国家的/地区的使用标准日历
* 月份用0-11表示
*/
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.*;
public class TestCalendar {
public static void main(String[] args) {
//获取相关日期元素
GregorianCalendar calendar = new GregorianCalendar(2999,10,9,
22,10,50);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int day1 = calendar.get(Calendar.DATE);//日:这里Calendar.DATE和Calendar.DAY_OF_MONTH同义
int date = calendar.get(Calendar.DAY_OF_WEEK);//星期几,周日是1,周一是2,周二是三……周六是7
int minute = calendar.get(Calendar.MINUTE);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
System.out.print(year+"年"+"\t");
System.out.print(month+1+"月"+"\t");
System.out.print(day+"\t");
System.out.print("("+day1+")"+"日"+"\t");
System.out.print("星期"+(date-1)+"\t");
System.out.print(hour+"时"+"\t");
System.out.println(minute+"分"+"\t");
//设置日期
GregorianCalendar calendar1 = new GregorianCalendar();
calendar1.set(Calendar.YEAR ,2999);
calendar1.set(Calendar.MONTH ,Calendar.FEBRUARY);
calendar1.set(Calendar.DATE,3);
calendar1.set(Calendar.DAY_OF_MONTH,10);
calendar1.set(Calendar.MINUTE,20);
calendar1.set(Calendar.SECOND,23);
printCalendar(calendar1);
//日期计算
GregorianCalendar calendar2 = new GregorianCalendar(2999,10,9,22,
10,50);
calendar2.add(Calendar.MONTH,-7);
calendar2.add(Calendar.DATE,7);
printCalendar(calendar2);
//日历对象和时间对象的转换
Date d = calendar2.getTime();
GregorianCalendar calendar3 = new GregorianCalendar();
calendar3.setTime(new Date());
}
static void printCalendar(Calendar calendar){
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int date = calendar.get(Calendar.DAY_OF_WEEK);
String week = ""+((date == 0)?"日":date);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.printf("%d年%d月%d日,星期%s %d时%d分%d秒\n",year,month,day,week,hour,minute,second);
}
}