一.java中的时间
1.1.java中的时间使用标准类库中的Date类来表示,使用距离一个固定时间点的毫秒数(可正、可负,类型为long)表达的一个特定的时间点。
1.2.固定的时间点叫做纪元(Epoch)是UTC时间1970年1月1日00:00:00。即1970年元旦。
1.3.Date的每一个实例用于表示一个确切的时间点,其内部维护了一个long值,改值记录的是1970年元旦到目前为止经历的毫秒数,由于Data设计上存在缺陷(时区、千年虫),所以Date类的大部分方法被设置为过时的方法,不在建议使用。所谓的时区问题就是对于不同的操作系统而言获取时间的方式不同,像Linux系统获取时间的方式是使用格林威治标准时间加上相对应的时区差来计算时间,但是对于Windows系统是直接获取系统的时间,千年虫问题就是一个进位问题,当数值超过某个数的时候就会发生错误。
1.4.使用默认的构造方法创建日期对象可以获取当前系统的时间,Date中的大部分方法不建议使用,但是由于java向下兼容的特性,因此不建议使用的方法并没有删除,但是Date类内部维护的用于获取long值的方法可以使用。
二.SimpleDateFormat(格式化时间)类的简介:
2.1.该类属于Java.text.SimpleDateFormat包中,其主要作用就是用于规定一个日期格式。
2.2常见的日期格式如下图:
2.3SimpleDateFormat中提供的方法 String format(Date date)可以将一个日期对象转换为我们自定的格式。
package Day03;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* java.text.SimpleDateFormat
* 根据一个给定的日期格式将String与Date相互转换
*/
public class SimpleDateFormatDemo1 {
public static void main(String[] args) {
//当前系统时间
Date now=new Date();
System.out.println(now);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*
* Date ->String
* String format(Date date)
* format方法可以将给定的date对象所表示时间按照SimapleDateFormat指定
* 的日期格式转换为字符串
*/
String str=sdf.format(now);
System.out.println(str);
}
}
2.4方法Date parse(String str)可以将一个字符串按照SimpleDateFormat给定的格式转换为日期对象。
package Day03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
* 从字符串转换为date
* date parse(String str)
* 将给定的字符串按照SimpleDateFormat指定的日期格式解析为
* 一个date 对象
*/
public class SimpleDateDormateDemo2 {
public static void main(String[] args) throws ParseException {
String str="2008-08-08 20:08:08";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(str);
System.out.println(date);
}
}
三.Calendar类的简介:
3.1.位于java.util.Calendar包中,用于封装日历信息,其主要作用在于该类提供的方法可以对日期的时间分量进行计算。
3.2.Calendar类是抽象类,其具体的子类针对于不同国家的日历系统,常用的类是GergorianCalendar,即通用的阳历。
3.3.该类不能创建实例,但是可以使用Calendar提供的静态方法getInsatnce()方法来创建实例,该方法会根据当前系统所在的地区创建一个相应的实现,通常是GregorianCalendar,默认创建的日历实例表示当前系统的时间。
3.4.由于Calendar类的toString方法不友好,即不能直观的表示当前的时间,因此需要将Calendar对象和Date对象进行转换,其中Calendar提供的getTime方法用于返回一个Date对象,该对象表示的时间就是Calendar对象表示的时间。
3.5.我们通常使用时间就是为了对时间的进行操作,因此需要将一个Date对象转换Calendar,Calendar类中提供的方法setTime(Date date)可以表示Date所表示的时间。
Date date=calendar.getTime();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
date.setTime(date.getTime()+24*60*60*1000);
System.out.println(date);
calendar.setTime(date);
3.6.Calendar提供的set(int field,int value)方法可以针对不同的时间分量单独设置值。第一个参数表示的是时间分量:例如:年,月,日等等,第二个参数为相对应的时间分量,将要设置的值。具体的实现如下:
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.getTime());
calendar.set(Calendar.YEAR, 2008);
System.out.println(calendar.getTime());
/*
* 设置月
* 月从0开始,0表示1
*/
calendar.set(Calendar.MONTH, 8);
System.out.println(calendar.getTime());
/*
* 设置日:
* 对应的时间分量常用的:
* DATE:月中天
* DATE_OF_MONTH:月中的天,与DATE一致
* DAY_OF_WEEK:周中的天,星期几
* DAY_OF_YEAR:年中的天
*/
calendar.set(Calendar.DAY_OF_MONTH, 8);
System.out.println(calendar.getTime());
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 8);
calendar.set(Calendar.SECOND, 8);
System.out.println(calendar.getTime());
}
3.7.Calendar提供的方法get(时间分量)方法,可以用来获取Calendar表示的具体的时间分量的值。
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
/*
* int get(int field_)
* 获取对应时间分量的值
*/
//获取年
int year=calendar.get(Calendar.YEAR);
//获取月
int month=calendar.get(Calendar.MONTH)+1;
//获取日
int day=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year+"-"+month+"-"+day);
//获取时
int hour=calendar.get(Calendar.HOUR_OF_DAY);
//获取分
int mo=calendar.get(Calendar.MINUTE);
//获取秒
int second=calendar.get(Calendar.SECOND);
System.out.println(hour+":"+mo+":"+second);
//获取周内天
int dow=calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("周"+(dow==1?7:dow-1));
String []data= {"日","一","二","三","四","五","六"};
System.out.println("周"+(data[dow-1]));
//到今天位置已经过了多少天
int doy=calendar.get(Calendar.DAY_OF_YEAR);
System.out.println(year+"已经过了"+doy+"天");
}
3.7.Calendar类提供的getActualMaximum(int field)方法可以获取对应的时间分量的最大值。
public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
//当月总共有多少天
int days=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int month=calendar.get(Calendar.MONTH)+1;
int year=calendar.get(Calendar.YEAR);
System.out.println(year+"年"+month+"月总共有"+days+"天");
//今年总共多少天
days=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(year+"年总共有"+days+"天");
}
3.8.Calendar提供的方法void add(int field,int number)可以对指定的时间分量增加某个具体的值,如果是负数,就减去对应的值。
/*
* 查看3年2个月1天以后的日期
*
*/
Calendar calendar=Calendar.getInstance();
//查看三年
calendar.add(Calendar.YEAR, 3);
System.out.println(calendar.getTime());
//查看两个月之后
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.getTime());
//查看25天之后
calendar.add(Calendar.DAY_OF_YEAR ,25);
System.out.println(calendar.getTime());
//查看五小时之前
calendar.add(Calendar.HOUR_OF_DAY, -5);
System.out.println(calendar.getTime());
四.总计
Date类的对象通常表示当前系统的时间,但是由于设计存在缺陷,其中的大部分方法都不在使用,SimpleDateFormat类的主要的作用就是规定一个日期格式,使输出的日期符合某种格式的要求,Calendar类的主要作用就是对日期分量进行操作的。