Java日期操作
Java中的时间
Java中的时间使用标准类库的Date类表示
是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点
固定的时间点叫纪元( epoch) , 是UTC时间1970年1月1日00:00:00
UTC(Universal Time Coordinated世界调整时间)
与GMT(Greenwich Mean Time格林威治时间)一样
是一种具有实际目的的科学标准时间
Java日期操作的常用类
Date
SimpleDateFormat
Calender
Date
java.util.Date类封装日期及时间信息
Date类的大多数用于进行时间分量计算的方法已经被Calendar取代。
Date的每一个实例用于表示一个确切的时间(精度为毫秒)
内部维护一个long值
该值表示的自1970年1月1日00:00:00到当前Date表示的时间之间所经过的毫秒
Date存在时区等设计缺陷,因此大部分方法都被声明为过时的,在以后的开发中不应当使用
常用API
long getTime() 获取Date内部维护的毫秒值
date.setTime(long l) 设置时间Date时间,从UTC时间的初始值开始设置
如果传入参数为零,则时间为1970年1月1日00:00:00
package date;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
//获取Date内部维护的毫秒值
long time = date.getTime();
System.out.println(time);
//设置时间归零,最初始的时间
date.setTime(0);
System.out.println(date);
}
}
SimpleDateFormat
java.text.SimpleDateFormat
该类可以将Date与String之间按照指定格式进行互相转换
SimpleDateFormat是个以与语言环境有关的方式来格式化和解析日期的具体类
它允许进行格式化(日期–>文本)、解析(文本–>日期)和规范化
构造方法
SimpleDateFormat ( )
SimpleDateFormat ( String pattern )用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat
将Date按格式解析成String(format)
String format(Date date) 将给定的Date对象按照当前SDF指定的日期格式转换为字符串
package date;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo1 {
public static void main(String[] args) {
Date now = new Date();
System.out.println(now);
/*
* 转化格式为:
* 2008-08-08 20:08:08
* yyyy-MM-dd HH:mm:ss
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String line = sdf.format(now);
System.out.println(line);
}
}
将正确格式的String解析成对应的Date(parse)
Date parse(String str) 将给定的String对象按照当前SDF指定的日期格式转换为Date
注意:这里需要抛出异常(ParseException),字符串如果不符合该格式,会抛出该异常
package date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo2 {
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 date = sdf.parse(str);
System.out.println(date);
}
}
日期模式匹配字符(注意大小写)
字符 | 含义 | 示例 |
---|---|---|
y | 年 | yyyy年-1997年;yy-97年 |
M | 月 | MM月-09月;M月-9月 |
d | 日 | dd日-07日;d日-7日; dd日27日;d日-27日 |
E | 星期 | E-星期日(sun) |
a | AM或PM标识 | a-下午(PM) |
H | 小时(24小时制) | HH-14 |
h | 小时(12小时制) | hh(a)-2(下午pm) |
m | 分钟 | mm-60 |
s | 秒 | ss-60 |
上述的可以只写一个(M、d、m、s),这里按照我们具体需要获取的格式需求来写
这样写超过一位的会显示两位,不超过一位的,不会显示前面的0
package date;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 测试日期模式匹配字符
* @author Tian
*
*/
public class SimpleDateFormatDemo3 {
public static void main(String[] args) {
//获取当前时间
Date date = new Date();
//设置转化格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yy-M-d");
System.out.println(sdf1.format(date));//19-8-21
SimpleDateFormat sdf2 = new SimpleDateFormat("E");
System.out.println(sdf2.format(date));//星期三
SimpleDateFormat sdf3 = new SimpleDateFormat("a");
System.out.println(sdf3.format(date));//下午
SimpleDateFormat sdf4 = new SimpleDateFormat("a hh:m:s");
System.out.println(sdf4.format(date));//下午 07:29:9
}
}
Calendar
java.util.Calendar 日历类
Calendar是一个抽象类,规定了日历操作时间的一系列方法
可以使用其提供的静态方法:getInstance来获取一个当前系统所在地区适用的实现类
大部分地区获取回来的是GregorianCalendar(格里高利历,即公历)
创建Calendar对象(getInstance)
可以使用其提供的静态方法:getInstance来获取一个当前系统所在地区适用的实现类
大部分地区获取回来的是GregorianCalendar(格里高利历,即公历)
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
Calendar与Date互相转换(getTime与setTime)
Date getTime() 可以将当前Calendar表示的日期以一个Date实例形式返回
void setTime(Date date) 调整当前Calendaar使其表示给定Date所表示的日期
package date;
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo1 {
public static void main(String[] args) {
//创建一个Calendar
Calendar calendar = Calendar.getInstance();
//将当前Calendar表示的日期以一个Date实例形式返回
Date date = calendar.getTime();
System.out.println(date);
//调整当前Calendaar使其表示给定Date所表示的日期
calendar.setTime(date);
System.out.println(calendar);
}
}
获取Calendar中的值(get)
int get(int field) 获取当前Calendar表示的日期中指定时间分量所对应的值
不同的时间分量用不同的整数表示,无需记忆,Calendar提供了大量的常量与之对应
int getActualMaximum(int field) 获取指定时间分量所允许的最大值,会自动根据年份和月份判断多少天
package date;
import java.util.Calendar;
public class CalendarDemo2 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
//获取年
int year = calendar.get(Calendar.YEAR);//其常量为1
//获取月
//int month = calendar.get(Calendar.MONTH);//发现少一个月
//注意获取的月是从0开始取的,所以需要加1(不要问我为什么,就这么设计的)
int month = calendar.get(Calendar.MONTH)+1;
//获取天
/*
* 和天相关的时间分量
* DAY_OF_YEAR:当前年的第几天
* DAY_OF_MONTH:当前月的第几天
* DAY_OF_WEEK:当前周的第几天
* DATE:月中的天,与DAY_OF_MONTH一致
*/
int day = calendar.get(Calendar.DATE);
System.out.println(year+"年"+month+"月"+day+"号");
//获取年中天
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("今天是今年的第"+dayOfYear+"天");
//获取月中天
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("今天是这个月的第"+dayOfMonth+"天");
//获取周中天
//注意:按照美国的习惯,一周的第一天是周日(所以需要减一)
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
System.out.println("今天是本周的第"+dayOfWeek+"天");
//可以通过数组对应为汉字
String[] days = {"日","一","二","三","四","五","六"};
System.out.println("今天是周"+days[dayOfWeek]);
//获取时分秒
//获取小时
//HOUR为12小时制,HOUR_OF_DAY为24小时制(即一天中的第几个小时)
int h1 = calendar.get(Calendar.HOUR);
int h2 = calendar.get(Calendar.HOUR_OF_DAY);
//获取分
int m = calendar.get(Calendar.MINUTE);
//获取秒
int s = calendar.get(Calendar.SECOND);
System.out.println("当前时间(12小时制)"+h1+":"+m+":"+s);
System.out.println("当前时间(24小时制)"+h2+":"+m+":"+s);
/*
* int getActualMaximum(int field)
* 获取指定时间分量所允许的最大值
* 会自动根据年份和月份判断多少天
*/
int d1 = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
int d2 = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("今年共"+d1+"天,该月共"+d2+"天");
}
}
调整Calendar中的时间(set)
void set(int field, int value) 调整当前Calendar指定的时间分量为给定的值
其强大的地方是,如果我们设置的时间超过了应该的值,会自动进位
比如一个月设置成了32天,这个月只有31天,那么会进位到下个月的1号
package date;
import java.util.Calendar;
public class CalendarDemo3 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
/*
* 调整时间为 1997-09-27 20:08:08
*/
//调整年
calendar.set(Calendar.YEAR, 1997);
//调整月(注意月从0开始,8月要设置为7)
calendar.set(Calendar.MONTH, 8);
//调整日
calendar.set(Calendar.DATE, 27);
System.out.println("调整后的时间为:"+calendar.getTime());
//上述可以一起调整(这里随便调整个时间,以作区分)
calendar.set(1998, 2, 27);
System.out.println("调整后的时间为:"+calendar.getTime());
//一起调整为2008-08-08 20:08:08
calendar.set(1997, 8, 27, 20, 8, 8);
System.out.println("调整后的时间为:"+calendar.getTime());
//设置的时间超过了会自动进位,这里月份设置超过了3个月
//时间从1997-09-27变为了1998-03-27
calendar.set(1997, 14, 27, 20, 8, 8);
System.out.println("调整后的时间为:"+calendar.getTime());
}
}
对Calendar添加时间量(add)
void add(int field, int amount) 对指定的时间分量加上给定的值,若给定的值为负数,则是减去
package date;
import java.util.Calendar;
public class CalendarDemo4 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
//查看3年前,2个月零25天以后,那天所在周的周三
//减3年
calendar.add(Calendar.YEAR, -3);
System.out.println("3年前:"+calendar.getTime());
//加2个月
calendar.add(Calendar.MONTH, 2);
System.out.println("2个月后:"+calendar.getTime());
//加25天
//calendar.add(Calendar.DATE, 25);
calendar.add(Calendar.DAY_OF_YEAR, 25);
System.out.println("25天后:"+calendar.getTime());
//设置为当周的周三
calendar.set(Calendar.DAY_OF_WEEK, 4);
System.out.println("这周的周三:"+calendar.getTime());
}
}
练习
练习一
程序启动后,要求用户输入自己的生日
格式为:yyyy-MM-dd
然后经过程序计算,输出到今天为止一共活了多少天
然后再输出其出生10000天的纪念日是哪天,输出格式同上
package date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws ParseException {
Scanner scan = new Scanner(System.in);
System.out.println("请输入你的生日:");
String birth = scan.nextLine();
//设置转换格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//根据输入的生日字符串转化为对应的日期格式
Date birthDate = sdf.parse(birth);
//获取现在的日期
Date now = new Date();
//计算到现在所过的毫秒值
long day = now.getTime()-birthDate.getTime();
//根据毫秒值算出天数
System.out.println("您已经活了"+(day/1000/60/60/24)+"天");
//获取生日加上10000天的毫秒值(注意long类型的溢出问题,在第一个相乘的数字后加上l)
long time = birthDate.getTime()+10000l*24*60*60*1000;
//利用日期的参构造器将日期设置为生日和10000天的毫秒值
Date date = new Date(time);
//格式化输出
System.out.println(sdf.format(date));
}
}
练习二
计算商品促销日期
程序启动后,要求用户输入商品生产日期:yyyy-MM-dd
再输入商品的保质期天数,为一个整数
然后经过计算,输出该商品促销日期,格式同上
规则:商品过期日前两周的周三为促销日期
package date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws ParseException {
Scanner scan = new Scanner(System.in);
System.out.println("请输入商品生产日期(yyyy-MM-dd)");
String birthDate = scan.nextLine();
System.out.println("请输入该商品的保质天数(整数):");
int day = scan.nextInt();
//设置日期转换格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将生产日期转换为date
Date startDate = sdf.parse(birthDate);
//创建一个Calendar类
Calendar date = Calendar.getInstance();
//将该日期转换为Calendar
date.setTime(startDate);
//对该日期加上保质天数
date.add(Calendar.DAY_OF_YEAR, day);
//格式化输出该日期(保质期)
System.out.println("保质期为:"+sdf.format(date.getTime()));
//计算该商品的促销日期
date.add(Calendar.WEEK_OF_YEAR, -2);
date.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
//格式化输出促销日
System.out.println("促销日为:"+sdf.format(date.getTime()));
}
}