一、Date类及其常用API
Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点。固定的时间点叫纪元,是UTC时间的1970年1月1日00:00:00。UTC(Universal Time Coordinated世界调整时间)与GMT(Greenwich Mean Time格林威治时间)一样,是一种具有实际目的的科学标准时间。
java.util.Date类封装日期及时间信息。
1.1、getTime()、setTime()
package day03;
import java.util.Date;
/**
* java.util.Date其内部维护一个long值保存从1970年元旦到这一刻的毫秒值
* @author Administrator
*/
public class DateDemo {
public static void main(String[] args){
//创建出来的实例表示当前系统时间
Date date = new Date();
/*Date重写了toString()方法,用一个字符串来描述当前Date对象
*所表示的时间。
*Mon Feb 18 18:06:00 CST 2017
*/
System.out.println(date);
//获取1970年1月1日零时距此刻的毫秒数
long time = date.getTime();
time += 1000*60*60*24;
System.out.println(time);
//设置为距离此刻一天后的日期和时间
date.setTime(time);
System.out.println(date);
}
}
二、SimpleDateFormat类
java.text.SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它可以进行与日期相关的格式化(日期->文本)、解析(文本->日期)和规范化。
2.1、SimpleDateFormat()、format()
构造方法SimpleDateFormat(String pattern)可以按照给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
日期模式匹配字符:
y —— 年
M —— 月
d —— 日
E —— 星期
a —— AM或PM标识
H —— 小时(24小时制)
h —— 小时(12小时制)
m —— 分钟
s —— 秒
final String format(Date date),该方法可以将Date格式化为String。
package day03;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* SimpleDateFormat可以根据一个特定的日期格式字符串将字符串与Date之间相互转换
* @author Administrator
*
*/
public class SimpleDateFormatDemo {
public static void main(String[] args) {
Date now = new Date();
System.out.println(now);
//2014-08-21 11:07:22
String format = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(format);
String str = sdf.format(now);
System.out.println(str);
}
}
2.2、parse()
和format方法相反,parse方法可按照特定格式将表示时间的字符串转换为Date对象。
package day03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 将字符串转换为Date
* @author Administrator
*
*/
public class SimpleDateFormatDemo2 {
public static void main(String[] args) throws ParseException{
String str = "2008年8月21日 23:44:21";
String format = "yyyy年MM月dd日 HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date = sdf.parse(str);
System.out.println(date);
}
}
三、Calendar类
java.util.Calendar类用于封装日历信息,其主要作用在于其方法可以对时间分量进行运算。
Calendar是抽象类,其具体子类针对不同国家的日历系统,其中应用最广泛的是GregorianCalendar(格里高里历,即通用的阳历),对应世界上绝大多数国家/地区使用的标准日历系统。
3.1、getInstance()、getTime()、setTime()
Calendar提供了一个类方法getInstance,返回一个Calendar对象,其日历字段已由当前日期和时间初始化。
Date getTime(),使用Date描述Calendar表示的日期并返回。
void setTime(Date d),使Calendar表示Date所描述的日期。
package day03;
import java.util.Calendar;
import java.util.Date;
/**
* java.util.Calendar
* 日历类
* 该类是一个抽象类,封装了对时间的相关操作。
* 常用的实现类格里高里历(阳历)
* 使用日历类是为了对时间进行相关的操作。比如计算时间。
* @author xxx
*
*/
public class CalendarDemo1 {
public static void main(String[] args) {
/*
* 使用Calendar的静态方法创建实例,该方法会根据当前系统所在地区创建一个相应的实现,
* 通常是GregorianCalendar。
* 默认创建的日历实例表示当前系统时间。
*/
Calendar calendar = Calendar.getInstance();
/*
*toString不能直观反映表示的日期
*/
System.out.println(calendar);
/*
*Calendar与Date之间的转换
*Calendar -> Date
*Date getTime()
*Calendar提供了方法getTime(),该方法返回一个Date对象,
*该对象表示的时间就是当前Calendar表示的时间。
*/
Date date = calendar.getTime();
System.out.println(date);
//表示明天这一时刻
date.setTime(date.getTime() + 1000 * 60 * 60 * 24);
System.out.println(date);
/*
*Date -> Calendar
*void setTime(Date date)
*Calendar的setTime方法可以使用当前Calendar表示给定的Date所表示的时间。
*/
//Calendar也表示明天这一刻了
calendar.setTime(date);
}
}
3.2、set()、get()
package day03;
import java.util.Calendar;
/**
* Calendar提供了针对不同时间分量单独设置值的方法。
* void set(int field,int value)
* 其中第一个参数为:时间分量,例如:年,月,日等等。第二个参数为对应的值。
* 时间分量是一个int值,使用Calendar提供的常量。
*/
public class CalendarDemo2 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
/*
*设置Calendar,使其表示
*2008-08-08 20:08:08
*/
//设定年
calendar.set(Calendar.YEAR,2008);
System.out.println(calendar.getTime());
/*
* 设置月
* 月从0开始,0表示1月。
* 或者可以使用具体月的常量。
*/
calendar.set(Calendar.MONTH, Calendar.AUGUST);
//calendar.set(Calendar.MONTH, 7);
/*
* 设置日
* 对应的时间分量常用的:
* DATE:月中天
* DAY_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());
}
}
package day03;
import java.util.Calendar;
/**
* 获取一个Calendar表示的日期中各个时间分量对应的值。
* @author xxx
*
*/
public class CalendarDemo3 {
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.DATE);
System.out.println(year+"-"+month+"-"+day);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
int sec = calendar.get(Calendar.SECOND);
System.out.println(hour+":"+min+":"+sec);
//查看星期几?
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.3、getActualMaximum()
int getActualMaximum(int field)给定此Calendar的时间值,返回指定日历字段可能拥有的最大值。
package day03;
import java.util.Calendar;
/**
* 获取某一个时间分量所允许的最大值
* @author xxx
*
*/
public class CalendarDemo4 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
//当月总共多少天?
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);
//查看2016年2月多少天?
calendar.set(Calendar.MONTH, 1);
days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);
//今年总共多少天?
days = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println("今年共:"+days+"天");
}
}
3.4、add()
void add(int field,int mount)为给定的时间分量的值加上给定的值,若给定的值为负数则是减去给定的值。
package day03;
import java.util.Calendar;
/**
* Calendar中计算时间的方法
* void add(int field,int value)
* 对指定的时间分量加上给定的值,若给定的值是负数,则是减去给定的值。
* @author xxx
*
*/
public class CalendarDemo5 {
public static void main(String[] args) {
/*
* 查看3年2个月零8天以后的日期?
*/
Calendar calendar = Calendar.getInstance();
//查看3年后
calendar.add(Calendar.YEAR, 3);
System.out.println(calendar.getTime());
//再查看2个月后
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.getTime());
//再查看8天以后
calendar.add(Calendar.DAY_OF_YEAR, 8);
System.out.println(calendar.getTime());
//再查看5小时以前
calendar.add(Calendar.HOUR_OF_DAY, -5);
System.out.println(calendar.getTime());
}
}
四、关于时间的综合操作
一般开发需求为要求用户输入一个日期,然后对该日期进行一系列的运算,再将计算后的日期显示给用户。则其解决流程如下:
1. 获取用户输入的日期字符串。
2. 使用SimpleDateFormat将其转换为Date。
3. 创建一个Calendar,使其表示Date表示的日期。
4. 使用Calendar根据需求计算时间。
5. 将Calendar转换为一个Date。
6. 使用SimpleDateFormat将Date转换为字符串后显示给用户。