JavaSE核心API--日期操作类
java.util.Date
1)理论讲解:使用Calendar计算时间
使用Calendar计算时间
void add(int field,int amount)
对指定时间分量加上给定的值,若给定的值为负数则是减去
代码演示:
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.getTime());
/*
* 3年2个月零25天以后是哪天?
*/
// 加3年
calendar.add(Calendar.YEAR, 3);
// 加2个月
calendar.add(Calendar.MONTH, 2);
// 加25天
calendar.add(Calendar.DAY_OF_YEAR, 25);
System.out.println(calendar.getTime());
// 调整为当周的周三
calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
System.out.println(calendar.getTime());
2)理论讲解:获取时间分量
Calendar提供了获取指定时间分量所对应的值的方法
int get(int field)
int值表示时间分量,Calendar提供了大量的常量与之对应
代码演示:
Calendar calendar=Calendar.getInstance();
// 获取年
int year=calendar.get(Calendar.YEAR);
// 获取月(月的值从0开始,即0表示1月)
int month=calendar.get(Calendar.MONTH)+1;
/*
* 获取日
* 和天相关的常量
* DAY_OF_MONTH:月中的天
* DAY_OF_WEEK:周中的天
* DAY_OF_YEAR:年中的天
* DATE:与DAY_OF_MONTH一致
*/
int day=calendar.get(Calendar.DATE);
System.out.println(year+"-"+month+"-"+day);
// 获取时分秒
int h=calendar.get(Calendar.HOUR_OF_DAY);
int m=calendar.get(Calendar.MINUTE);
int s=calendar.get(Calendar.SECOND);
System.out.println(h+":"+m+":"+s);
// 今年是今年的第几天
int doy=calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("今天是今年的第"+doy+"天");
// 今天星期几?
int dow=calendar.get(Calendar.DAY_OF_WEEK)-1;
String[] data= {"日","一","二","三","四","五","六"};
System.out.println("今天是周"+data[dow]);
/*
* 获取指定时间分量所允许的最大值
*/
int days=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println("今年共"+days+"天");
3)理论讲解:设置指定的时间分量对应的值
代码演示:
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.getTime());
//设置为2008
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 7);
/*
* set方法由一个注意事项:
* 当set设置了两次,而两次影响的时间分量一致时:
* 比如设置几号后,又设置了周几,这两个看似不同的时间分量实际影响的都是月中的天
* 那么后设置的会覆盖之前设置的操作,若想它们都起效果
* 可以在设置一个后,调用getTime方法计算一下修改后的日期然后再设置另一个
*/
calendar.set(Calendar.DATE, 8);
//注释下面的输出语句与不注释效果是不同的
// System.out.println(calendar.getTime());
// 设置为周三
calendar.set(Calendar.DAY_OF_WEEK, 4);
System.out.println(calendar.getTime());
3)理论讲解:Calender类
java.util.Calender
日历类,本身是一个抽象类,规定了日历类的功能定义
常用实现类:GregorianCalendar,即:阳历
Calendar是操作时间的API
代码演示:
Calendar calendar=Calendar.getInstance();
System.out.println(calendar);
System.out.println(calendar.getTime());
4)理论讲解:Date类
java.util.Date
Date的每一个实例用于表示一个具体的时间,内部维护一个long值
表示自1970年1月1日 00:00:00到该Date表示的时间之间所经过的毫秒
由于Date存在时区问题和千年虫问题,因此大部分操作时间的方法都被声明为过时的,不再建议使用了
代码演示:
Date now=new Date();
System.out.println(now);
long time=now.getTime();
System.out.println(time);
now.setTime(0);
System.out.println(now);
5)理论讲解:格式转换
java.text.SimpleDateFormat
可以在String与Date之间相互转换
代码演示:
Date now=new Date();
System.out.println(now);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 E a hh:mm:ss");
System.out.println(sdf.format(now));
6)理论讲解:将一个字符串解析为Date
代码演示:
String str="2008-08-08 08:08:08";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = sdf.parse(str);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
7)小练习1.创建一个线程,在控制台不断输出当前时间,精确到时分秒,每隔一秒输出一次。
public class Test {
public static void main(String[] args) {
Thread thread = new MyThread();
thread.start();
}
}
// 通过继承Thread类 来重写run方法
class MyThread extends Thread {
// 通过正则式来设置输出的时间格式
SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 重写run()方法
public void run() {
while (true) {
String str = s.format(new Date());
System.out.println(str);
try {
// 间隔时间1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
8)小练习2.程序启动后要求输入用户的生日,格式:yyyy-MM-dd,然后经过程序运算输出到今天为止一共活了多少天?再输出该用户出生10000天的纪念日为哪天?格式:yyyy-MM-dd.
public static void main(String[] args) throws ParseException {
// 获取用户输入的生日
Scanner scan = new Scanner(System.in);
System.out.println("请输入您的生日(格式为yyyy-MM-dd):");
String str = scan.nextLine();
scan.close();
// 把字符串转换为日期格式
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(str);
// 获取今天的日期
Date now = new Date();
// 计算活了多少天
long day = (now.getTime() - date.getTime()) / 1000 / 60 / 60 / 24;
System.out.println("您一共活了" + day + "天!");
System.out.println(day / 365 + "年" + day % 365 / 30 + "个月" + day % 365 % 30 / 7 + "周零" + day % 365 % 30 % 7 + "天");
// 计算10000天纪念日
now.setTime(now.getTime() + (10000 - day) * 24 * 60 * 60 * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E a hh:mm:ss");
System.out.println("您的10000天纪念日为:" + sdf.format(now));
// SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 E a hh:mm:ss");
// long time=date.getTime()+1000L*60*60*24*10000;
// System.out.println("您出生1万天的纪念日为:"+sdf.format(time));
}
9)小练习3.计算商品促销日期,程序启动后,要求用户输入商品生产日期,格式:yyyy-MM-dd,然后再输入保质期的天数,经过程序运算后输出该商品的促销日期,格式:yyyy-MM-dd,规则:商品过期日前两周的周三.
public static void main(String[] args) throws ParseException {
Scanner scan = new Scanner(System.in);
System.out.println("请输入商品生产日期:");
String s1 = scan.nextLine();
System.out.println("请输入商品保质期:");
int day = Integer.parseInt(scan.nextLine());
scan.close();
// 把字符串转换为日历格式
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(s1);// 字符串转日期格式
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);// 日期转日历格式
// 过期时间
// 加保质期的天数
calendar.add(Calendar.DAY_OF_YEAR, day);
System.out.println(day + "天过后的日期为:" + new SimpleDateFormat("yyyy-MM-dd E").format(calendar.getTime()));
// 2周前(-14天)
calendar.add(Calendar.DAY_OF_YEAR, -14);
// 调整为周三
calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
System.out.println("该商品的促销日期为:" + new SimpleDateFormat("yyyy-MM-dd E").format(calendar.getTime()));// 日历转日期格式
}