Java中日期与时间API – Date类
什么是Date类
java.util.Date类是java中可以表示时间(精确到毫秒)的对象
Date的每一个实例用于表示一个时间,内部维护一个long值,该值保存的是自1970年元旦到当前Date所表示的时间之间经过的毫秒。
为什么需要Date类
有了Date类我们才能表示日期或时间,比如今天是哪年哪月哪日,比如跑步用了几分几秒,如果没有时间那么这些需求都非常难以实现
Date类的注意事项
Date内部由于存在千年虫和时区的问题,因此大部分方法都被声明为过时的,不再建议使用了。
package day03;
import java.util.Date;
/**
* java.util.Date
* Date的每一个实例用于表示一个具体的时间
* 内部维护一个long值,该值表示UTC时间,即:
* 公园1970年元旦到该Date表示的时间之间所经过的毫秒
*
* 由于Date存在设计缺陷,所以大部分方法已经被声明为
* 过时方法,不再建议使用。
*
* @author adminitartor
*
*/
public class DateDemo1 {
public static void main(String[] args) {
/*
* 默认创建出来表示当前系统时间
*/
Date date = new Date();
/*
* Date重写了toString,用来显示其表示的日期和时间
*/
System.out.println(date);
//Date提供的大部分方法都是过时方法,不要使用
// int year = date.getYear();
/*
* long getTime()
* 获取Date内部维护的long值
*/
long time = date.getTime();
System.out.println(time);
time = time + 1000*60*60*24;
/*
* void setTime(long time)
* 对Date设置一个long值使其表示该日期
*/
date.setTime(time);
System.out.println(date);
}
}
SimpleDateFormat类
什么是SlmpleDateFormat
它是一个能将Date对象和字符串对象相互转换的类,可以按照约定好的格式转换,操作很方便
将一个时间转换成字符串
y:年 yyyy年–2013年;yy年–13年
M:月 MM月–01月;M月–1月
d:日 dd日–06日;d日–6日
E:星期 E–星期六
a:AM/PM
H:小时(24小时制) HH:mm:ss a
h:小时(12小时制)hh(a):mm:ss
m:分钟
s:秒
package day03;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* java.text.SimpleDateFormat
* 该类允许按照一个给定的日期格式在Date与String
* 之间相互转换。
* @author adminitartor
*
*/
public class SimpleDateFormat_format {
public static void main(String[] args) {
Date now = new Date();
System.out.println(now);
/*
* 2021-05-10 10:40:22
* yyyy-MM-dd HH:mm:ss
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*
* String format(Date date)
* 将给定的Date表示的日期按照当前SimpleDateFormat
* 指定的格式转换为字符串
*/
String str = sdf.format(now);
System.out.println(str);
}
}
将字符串转换成时间类型
package day03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Date parse(String str)
* 将给定个的字符串按照当前SimpleDateFormat指定的
* 日期格式解析为一个Date对象来实际表示该日期
* @author adminitartor
*
*/
public class SimpleDateFormat_parse {
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);
}
}
练习:计算到目前为止活了多少天;1000天后的纪念日
package day03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 程序启动后要求用户输入自己的生日
* 格式如:1992-08-02
* 经过程序计算,输出到今天为止活了多少天
*
* @author adminitartor
*
*/
public class Test {
public static void main(String[] args) throws ParseException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的生日:(yyyy-mm-dd)");
String birthStr = scanner.nextLine();
//将用户的生日转换为Date
SimpleDateFormat sdf
= new SimpleDateFormat("yyyy-MM-dd");
Date birthDate = sdf.parse(birthStr);
//当前系统时间
Date now = new Date();
//计算今天与生日之间经过的好毫秒
long time = now.getTime()-birthDate.getTime();
//换算为天
time = time/1000/60/60/24;
System.out.println("恭喜您,已经活了"+time+"天!请继续保持!");
//计算出生100e0天纪念日time = birth.getTime();
time = time+1000L*60*60*24*10000;
Date date = new Date(time) ;
line = sdf.format(date) ;
system.out.println("您出生100oo天的纪念日为: "+line) ;
}
}
Calendar日历类
什么是Calendar
Calendar本身是一个抽象类,不能实例化,,只是规定了操作时间的相关方法等。
常用实现类:java.util.GregorianCalendar 即:阳历历法
格林高里历
为什么需要Calendar
Date类的设计有很多缺陷,比如2020年的Date对象获得年getYear()返回值为120等
使用Calendar能够弥补很多Date使用的不便
怎么使用calendar
我们可以通过Calendar提供的静态方法getlnstance来根据当前系统所在地区获取一个使用的实现类。大部分地区获取的都是阳历实现类。
Calendar基本使用
package day03;
import java.util.Calendar;
import java.util.Date;
/**
* java.util.Calendar
* 日历类,用于计算时间,操作时间使用。
* Calendar是一个抽象类,只规定了操作时间的相关方法
* 定义。并没有具体实现。
* 常用的实现类GregorianCalendar,即:阳历历法
*
* Calendar提供了一个静态方法getInstance,该方法可以
* 根据当前系统所在地区返回一个合适的日历实现类,大部分
* 返回的都是阳历实现类GregorianCalendar
*
*
*
*
* @author adminitartor
*
*/
public class Calendar_getInstance {
public static void main(String[] args) {
//默认表示当前系统时间
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
/*
* Calendar -> Date
* Date getTime()
* Calendar提供的getTime方法可以将其表示的时间
* 以一个Date实例形式返回。
*/
Date date = calendar.getTime();
System.out.println(date);
/*
* Date -> Calendar
* Calendar提供了方法:
* void setTime(Date date)
* 可以使当前Calendar表示给定的Date所表示的
* 日期
*/
calendar.setTime(date);
}
}
Calender对象获取日期
Calendar提供了一个方法:
int get(int field)
该方法可以获取给定时间分量所对应的值。
参数是一个int值,不同的值表示不同的时间分量,无需记住每个值表示什么,因为Calendar提供了大量的常量表示了这些时间分量的值。
package day03;
import java.util.Calendar;
public class Calendar_get {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
//获取年?
int year = calendar.get(Calendar.YEAR);
System.out.println(year);
/*
* 获取月?
* 月从0开始,即:0表示1月,1表示2月...
* 月在Calendar中的值有常量对应
*/
int month = calendar.get(Calendar.MONTH)+1;
//获取日?
/*
* 获取日
* 和"天"相关的时间分量:
* DATE:月中的天
* DAY_OF_MONTH:月中的天,与DATE是一样的
* DAY_OF_WEEK:周中的天,就是星期几
* DAY_OF_YEAR :年中的天,今年的第几天
*/
int day = calendar.get(Calendar.DAY_OF_MONTH);
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);
String[] data = {"日","一","二","三","四","五","六"};
int dow = calendar.get(Calendar.DAY_OF_WEEK)-1;
System.out.println("周"+data[dow]);
int doy = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("已经是今年的第"+doy+"天");
/*
* 获取给定时间分量所允许的最大值
*/
int dd = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println("今年一共:"+dd+"天");
}
}
Calender对象设置时间
Calendar提供了可以对指定时间分量设置一个值
void set(int field,int value)
参数需要传递要设置的时间分量,和设置的时间分量值
package chapter03;
import java.util.Calendar;
/**
* Calendar提供了可以对指定时间分量设置一个值
* void set(int field,int value)
* 参数需要传递要设置的时间分量,和设置的时间分量值
* @author tedu
*
*/
public class CalendarDemo03 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();//2021-5-12
System.out.println(calendar.getTime());
//2008-08-08 8:8:8
calendar.set(Calendar.YEAR, 2008);
System.out.println(calendar.getTime());
calendar.set(Calendar.MONTH, 7);
System.out.println(calendar.getTime());
calendar.set(Calendar.DAY_OF_MONTH, 8);
System.out.println(calendar.getTime());
calendar.set(Calendar.HOUR_OF_DAY, 20);
System.out.println(calendar.getTime());
calendar.set(Calendar.MINUTE, 8);
System.out.println(calendar.getTime());
calendar.set(Calendar.SECOND, 8);
System.out.println(calendar.getTime());
calendar.set(Calendar.DAY_OF_WEEK, 4);
System.out.println(calendar.getTime());
}
}
Calendar时间计算
Calendar提供了用于计算时间的方法
void add(int field ,int value);
是给定的时间分量加上给定的值,若给定的值为负数则是减法
package chapter03;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class CalendarDemo04 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
//查看5年8个月69天后,再往前推130后的日期
calendar.add(Calendar.YEAR, 5);
calendar.add(Calendar.MONTH, 8);
calendar.add(Calendar.DAY_OF_YEAR, 69);
calendar.add(Calendar.DAY_OF_YEAR, -130);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
System.out.println(sdf.format(calendar.getTime()));
}
}
小提示
时间转换的过程和使用到的方法
“2021-05-21”
String(parse) —> Date(Calender setTime) –> Calender(Calendar getTime) —> Date(format) –> String