日期操作类 Date
一.Date java.util包
- Date是用来表示时间的类,时间精确到毫秒 。现在使用的时间是从1970.1.1
1.构造方法
- Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
- Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
- Date(String s) 已过时。 从 JDK 1.1 开始,由 DateFormat.parse(String s) 取代。
2.常用方法
- long
getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 - int
getYear() 返回自日期表示的年份减去 1900。 - int
getMonth() 返回的是此日期所表示的月份(0–11) - int
getDay() 返回的是此日期所表示的一周中的某一天。 - int
getHours() 返回的是此日期所表示的小时 - int
getMinutes() 返回的是此日期所表示的小时已经过去的分钟数。 - boolean
after(Date when) 测试此日期是否在指定日期之后。 - boolean
before(Date when) 测试此日期是否在指定日期之前。
@Testvoid test() {
//实例化Date date=new Date();//获取系统当前的时间System.out.println(date);//Wed Nov 18 17:56:12 CST 2020//获取1970年到现在的毫秒值System.out.println(date.getTime());//1605693372216System.out.println(System.currentTimeMillis());//1605693372223Date date01=new Date(0);System.out.println(date01);//Thu Jan 01 08:00:00 CST 1970//获取System.out.println("获取年:"+date.getYear());//获取年:120System.out.println("获取月:"+date.getMonth());//获取月:10System.out.println("获取日:"+date.getDay());//获取日:3System.out.println("获取时:"+date.getHours());//获取时:17//获取当前时间Date date02=new Date();Date date03=new Date(date02.getTime()+(24*60*60*1000*2));System.out.println("当前时间为"+date02);//当前时间为Wed Nov 18 17:56:12 CST 2020System.out.println("两天后的时间为"+date03);//两天后的时间为Fri Nov 20 17:56:12 CST 2020// 判断时间是否在指定时间的前面和后面 System.out.println(date02.before(date03));//trueSystem.out.println(date02.after(date03));//false}
二.DateFormat
- SimpleDateFormat是DateFormat 抽象类的实现类。
- 输出的时间要么是国际时间 ,要么是毫秒时间。
- 使用日期格式转换器,来进行输出格式转换。
1.SimpleDateFormat构造方法
(1)时间日期模式
(2)示例
2.常用方法
- String
format(Date date) 将一个 Date 格式化为日期/时间字符串。date —>String - Date
parse(String source) 从给定字符串的开始分析文本,以生成一个日期。String—>Date
/*1.将date需要的格式输出 *2.使用指定格式的字符串得到一个date 2020.11.18*/
// 格式转换@Testvoid test01() {
//创建转换器SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd -- HH点mm分ss秒");SimpleDateFormat sdf01 = new SimpleDateFormat("yyyy-MM-dd");Date date = new Date();//获取当前时间String format = sdf.format(date);System.out.println("当前时间为:"+format);//当前时间为:2020年11月18 -- 18点16分49秒//给一个格式时间,来得到一个dateString date1="2020-11-18";try {
Date parse = sdf01.parse(date1);System.out.println("得到的date是:"+parse);//得到的date是:Wed Nov 18 00:00:00 CST 2020//指定时区System.out.println("得到的date是:"+parse.getMonth());} catch (ParseException e) {
// TODO Auto-generated catch blocke.printStackTrace();}}
三.Calender
1.日历格式的时间的对象,属性
- static Calendar
getInstance() 使用默认时区和语言环境获得一个日历。 - static int
DAY_OF_MONTH get 和 set 的字段数字,指示一个月中的某天。 - static int
DAY_OF_WEEK get 和 set 的字段数字,指示一个星期中的某天。 - static int
DAY_OF_WEEK_IN_MONTH get 和 set 的字段数字,指示当前月中的第几个星期。 - static int
DAY_OF_YEAR get 和 set 的字段数字,指示当前年中的天数。 - static int
HOUR get 和 set 的字段数字,指示上午或下午的小时。 - static int
HOUR_OF_DAY get 和 set 的字段数字,指示一天中的小时。 - static int
MINUTE get 和 set 的字段数字,指示一小时中的分钟。 - static int
MONDAY 指示 Monday 的 DAY_OF_WEEK 字段值。 - static int
MONTH 指示月份的 get 和 set 的字段数字。 - static int
SECOND get 和 set 的字段数字,指示一分钟中的秒。 - static int
WEEK_OF_MONTH get 和 set 的字段数字,指示当前月中的星期数。 - static int
WEEK_OF_YEAR get 和 set 的字段数字,指示当前年中的星期数。 - static int
YEAR 指示年的 get 和 set 的字段数字。
@Testvoid test02() {
//获取对象Calendar calendar=Calendar.getInstance();//获取具体的日历属性值System.out.println("今年是"+calendar.get(1)+"年");//不推荐使用 今年是2020年System.out.println("今年是"+calendar.get(Calendar.YEAR)+"年");//今年是2020年System.out.println("本月是第"+calendar.get(Calendar.MONTH)+"月");//本月是第10月System.out.println("今天是今年的第"+calendar.get(Calendar.DAY_OF_YEAR)+"天");//今天是今年的第323天System.out.println("今天是本月的第"+calendar.get(Calendar.DAY_OF_MONTH)+"天");//今天是本月的第18天System.out.println("今天是本周的第"+calendar.get(Calendar.DAY_OF_WEEK)+"天");//今天是本周的第4天System.out.println("现在是"+calendar.get(Calendar.HOUR)+"点");//现在是7点System.out.println("现在是"+calendar.get(Calendar.HOUR_OF_DAY)+"点");//现在是19点System.out.println("现在是"+calendar.get(Calendar.MINUTE)+"分");//现在是37分System.out.println("现在是"+calendar.get(Calendar.SECOND)+"秒");//现在是47秒}
2.常用方法
- abstract void
add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。 - int
get(int field) 返回给定日历字段的值。 - void
set(int field, int value) 将给定的日历字段设置为给定值。 - void
set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。 - void
set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。 - void
set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
@Testvoid test03() {
//获取对象Calendar calendar=Calendar.getInstance();//将Calendar转为 dateDate time = calendar.getTime();//Wed Nov 18 19:54:13 CST 2020System.out.println(time);calendar.set(Calendar.DAY_OF_MONTH, 16);//重新设置System.out.println(calendar.getTime());//Mon Nov 16 19:54:13 CST 2020// 在原有日期上添加时间calendar.add(Calendar.DAY_OF_MONTH, 16);System.out.println(calendar.getTime());//Wed Dec 02 19:54:13 CST 2020calendar.add(Calendar.DAY_OF_WEEK, 2);System.out.println(calendar.getTime());//Fri Dec 04 19:54:13 CST 2020}
@Testvoid test() {
//实例化日历对象Calendar instance = Calendar.getInstance();System.out.println(instance);//设置instance.set(Calendar.DAY_OF_YEAR,200);//获取System.out.println(instance.get(Calendar.DAY_OF_YEAR));}
- Calendar (DateFormat里面的方法)
getCalendar() 获得与此日期/时间 formatter 关联的日历。
// 键盘输入得到Calender string -->calender@Testvoid test04() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");Scanner input=new Scanner(System.in);System.out.println("请输入一个日期:");//2020.11.18String time=input.next();try {
Date parse = sdf.parse(time);System.out.println(parse);//Wed Nov 18 00:00:00 CST 2020Calendar calendar = sdf.getCalendar();System.out.println(calendar.getTime());//Wed Nov 18 00:00:00 CST 2020} catch (ParseException e) {
// TODO Auto-generated catch blocke.printStackTrace();}
// 键盘输入的数据 转为 Calendar @Testvoid test01() {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Scanner input=new Scanner(System.in);System.out.println("请输入一个日期:");String date=input.next();try {
sdf.parse(date);Calendar calendar = sdf.getCalendar();System.out.println(calendar);} catch (ParseException e) {
// TODO Auto-generated catch blocke.printStackTrace();}}// 转换 String -->date -->将date的值赋给一个calendar @Testvoid test02() {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");Scanner input=new Scanner(System.in);System.out.println("请输入一个日期:");String date=input.next();try {
Date parse = sdf.parse(date);Calendar calendar = sdf.getCalendar();calendar.setTime(parse);System.out.println(calendar);} catch (ParseException e) {
// TODO Auto-generated catch blocke.printStackTrace();}}
四.JDK1.8的日期类
1.Year
属性
- static int
MAX_VALUE 最大支持的一年,“999999999”。 - static int
MIN_VALUE 最低支持的一年,“- 999999999”。
方法
- static Year
now() 从默认时区中的系统时钟获取当前年份。 - static Year
now(Clock clock) 从指定的时钟获取当前年份。 - static Year
of(int isoYear) 获得 Year实例。 - boolean
isAfter(Year other) 是今年指定的一年后。 - boolean
isBefore(Year other) 是今年前指定的一年。 - int
length() 获取这一年的长度。 - String
toString() 作为今年的 String输出。
@Testvoid test() {
//YearSystem.out.println(Year.MAX_VALUE);//999999999System.out.println(Year.MIN_VALUE);//-999999999//获取当前年份Year now = Year.now();System.out.println(now);//输出年份2020Year of = Year.of(1999);System.out.println(of);//1999System.out.println(now.isAfter(of));//trueSystem.out.println(now.isBefore(of));//falseSystem.out.println(now.length());//366String string = now.toString();System.out.println(string);//2020}
2.Month
方法
- static Month
of(int month) 获得 Month实例从一个 int价值。 - int
length(boolean leapYear) 获取本月的长度。 - int
maxLength() 获取这个月的最大长度。 - int
minLength() 获取这个月的最小长度。 - static Month
of(int month) 获得 Month实例从一个 int价值。 - Month
plus(long months) 返回一年的月,是指定数量的后,这一个。 - static Month[]
values() 返回一个数组包含该枚举类型的常量,它们的顺序声明。
@Testvoid test01() {
//month是表示月的对象Month of = Month.of(11);System.out.println(of.maxLength());//30System.out.println(of.minLength());//30System.out.println(of.getValue());//11Month plus = of.plus(3);System.out.println(plus.getValue());//2System.out.println(plus.maxLength());//29Month[] values=Month.values();System.out.println(values.length);//12}
3.YearMonth
方法
- String
toString() 输出为 String今年月,如 2007-12。 - static YearMonth
of(int year, int month) 获得 YearMonth实例从年月。
3.static YearMonth
now() 从默认时区中获得当前年月的时间。 - static YearMonth
now(Clock clock) 从指定的时钟获取当前年月。
@Testvoid test02() {
//YearMonthYearMonth now = YearMonth.now();System.out.println(now);//2020-11System.out.println(now.toString());//2020-11YearMonth of = YearMonth.of(2020, 1);System.out.println(of);//2020-01}
4.本地时间
(1) 本地日期(LocalDate)
a.属性
- static LocalDate
MAX 所支持的最大 LocalDate,’ + 999999999 -12-31”。 - static LocalDate
MIN 最小支持 LocalDate,”999999999 -01-01”。
@Testvoid test03() {
LocalDate max = LocalDate.MAX;System.out.println(max);//+999999999-12-31LocalDate min = LocalDate.MIN;System.out.println(min);//-999999999-01-01}
b.方法
- static LocalDate
of(int year, int month, int dayOfMonth) 获得 LocalDate实例从一年、月、日。 - static LocalDate
now() 在默认时区中从系统时钟获取当前日期。 - String
toString() 输出该日期作为 String,如 2007-12-03。 - String
format(DateTimeFormatter formatter) 使用指定的格式的日期格式。 - static LocalDate
ofEpochDay(long epochDay) 获得 LocalDate实例从时代的日数。
@Testvoid test04() {
LocalDate now = LocalDate.now();System.out.println("今天是"+now);//今天是2020-11-21LocalDate of = LocalDate.of(2020, 11, 8);System.out.println(of);//2020-11-08System.out.println(of.toString());//2020-11-08LocalDate ofEpochDay = LocalDate.ofEpochDay(365);System.out.println(ofEpochDay);//1971-01-01}
(2)本地时间(LocalTime)
a.属性
- static LocalTime
MAX 所支持的最大 LocalTime,“23:59:59. 999999999。 - static LocalTime
MIDNIGHT 在一天的开始,午夜时分,“00:00”。 - static LocalTime
MIN 最小支持 LocalTime 00:00,’ '。 - static LocalTime
NOON 在一天的中间时间中午12:00,’ '。
@Testvoid test05() {
LocalTime max = LocalTime.MAX;System.out.println(max);//23:59:59.999999999LocalTime min = LocalTime.MIN;System.out.println(min);//00:00LocalTime midnight = LocalTime.MIDNIGHT;System.out.println(midnight);//00:00LocalTime noon = LocalTime.NOON;System.out.println(noon);//12:00}
b.方法
- static LocalTime
now() 在默认时区中从系统时钟获取当前时间。 - static LocalTime
of(int hour, int minute, int second) 获得 LocalTime实例从一个小时、分钟和秒。 - int
toSecondOfDay() 提取时间为秒的日子,从 0到 24 * 60 * 60 - 1。 - String
toString() 输出这个时间作为一个 String,如 10:15。
@Testvoid test06() {
// 时间:时分秒LocalTime now2 = LocalTime.now();System.out.println("现在是"+now2);//现在是23:08:43.125LocalTime of = LocalTime.of(11, 42, 30);System.out.println(of);//11:42:30System.out.println(of.toString()); //11:42:30}
(3)本地日期时间(LocalDateTime)
a.属性
- static LocalDateTime
MAX 所支持的最大 LocalDateTime,’ + 999999999 -12-31t23:59:59. 999999999。 - static LocalDateTime
MIN 最小支持 LocalDateTime,”999999999 -01-01t00:00:00”。
@Testvoid test06() {
LocalDateTime max = LocalDateTime.MAX;System.out.println(max);//+999999999-12-31T23:59:59.999999999LocalDateTime min = LocalDateTime.MIN;System.out.println(min);//-999999999-01-01T00:00}
b.方法
- static LocalDateTime
now() 从默认时区中的系统时钟中获取当前日期时间。 - static LocalDateTime
of(int year, int month, int dayOfMonth, int hour, int minute) 获得 LocalDateTime从年,月,日的一个实例,小时和分钟,设置第二和纳秒到零。 - String
toString() 输出该日期时间为 String,如 2007-12-03T10:15:30。
@Testvoid test06() {
// 年月日时分秒LocalDateTime now3 = LocalDateTime.now();System.out.println(now3);//2020-11-21T23:22:09.054LocalDateTime of = LocalDateTime.of(2020, 11, 1, 8, 20);System.out.println(of);//2020-11-01T08:20String string = of.toString();System.out.println(string);//2020-11-01T08:20}
5. Instant时间戳
- static Instant
now() 从系统时钟中获得当前时刻。 - long
getEpochSecond() 从1970-01-01t00:00:00z java时代得到的秒数。
// 时间戳也称为瞬时时间@Testvoid test07() {
// 我们在东八区,加8个小,就是我们的北京时间Instant now = Instant.now();System.out.println(now);//2020-11-21T15:48:10.016Z//瞬时时间转为datelong epochSecond = now.getEpochSecond();System.out.println(epochSecond);//1605973690Calendar instance = Calendar.getInstance();instance.setTimeInMillis(epochSecond*1000);Date time = instance.getTime();System.out.println(time);//Sat Nov 21 23:48:10 CST 2020}
6.时间间隔
(1)时间间隔
常用方法
- static Duration
between(Temporal startInclusive, Temporal endExclusive) 获得 Duration表示两个时间对象之间的时间。 - int
getNano() 得到的纳秒数在第二在这个时间。 - long
getSeconds() 获取在此期间的秒数。 - long
toDays() 获取在此期间的天数。 - long
toHours() 获取在此期间的几个小时数。 - long
toMillis() 将此持续时间转换为毫秒内的总长度。 - long
toMinutes() 获取在此期间的分钟数。 - long
toNanos() 将这个时间的总长度来表示为一个 long。 - String
toString() 本期使用ISO-8601秒表示的字符串表示,如 PT8H6M12.345S。
//时间间隔@Testvoid test08() {
//获取当前时间 Temporal可以使用已知实现子类LocalDateTime start = LocalDateTime.now();System.out.println(start);//2020-11-23T13:38:47.106//休息一会儿try {
Thread.sleep(2000);} catch (InterruptedException e) {
// TODO Auto-generated catch blocke.printStackTrace();}LocalDateTime end = LocalDateTime.now();System.out.println(end);//2020-11-23T13:38:49.106//进行比较Duration between = Duration.between(start, end);System.out.println(between.toMillis());//2000System.out.println(between.toMinutes());//0System.out.println(between.toNanos());//2000000000}
(2)日期间隔
- static Period
between(LocalDate startDateInclusive, LocalDate endDateExclusive) 获得由年数 Period月,和两个日期之间的天数。 - int
getYears() 获取此期间的年数。 - int
getDays() 获取此期间的天数。 - int
getMonths() 获取此期间的月数。 - static Period
of(int years, int months, int days) 获得 Period代表数年、月和日。
//日期间隔@Testvoid test09() {
LocalDate start = LocalDate.now();LocalDate end = LocalDate.now();LocalDate start1 = LocalDate.of(2020, 8, 12);LocalDate end1 = LocalDate.of(2020, 11, 23);//进行计较Period between = Period.between(start1, end1);System.out.println(between.getYears());//间隔了多少年0System.out.println(between.getMonths());//间隔了多少个月3System.out.println(between.getDays());//间隔了多少天11}
(3)clock
a.构造方法
protected
Clock() 由子类访问的构造函数。
b.常用方法
- abstract Instant
instant() 获取时钟的当前时刻。 - long
millis() 获取时钟的当前毫秒瞬间。 - static Clock
systemDefaultZone() 获得一个时钟,使用最佳可用的系统时钟返回当前的即时时钟,转换为使用默认时区的日期和时间。
// 获取钟表时间 对象 @Testvoid test10() {
Clock systemDefaultZone = Clock.systemDefaultZone();System.out.println(systemDefaultZone.instant());//2020-11-23T05:37:35.542ZSystem.out.println(systemDefaultZone.millis());//1606109855548System.out.println(System.currentTimeMillis());//1606109855548}
总结时间的各类转换
@Testvoid test05() {
// 时间戳long timestamp = System.currentTimeMillis();// 瞬时点Instant instant = Instant.now();// DateDate date = new Date(); // 时间戳转瞬时点Instant instant1 = Instant.ofEpochMilli(timestamp); // 瞬时点转时间戳long timestamp1 = instant1.toEpochMilli();// Date转瞬时点Instant instant2 = date.toInstant();// 瞬时点 转 DateDate date1 = Date.from(instant2);// 瞬时点 本地时间LocalDateTime ldt = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault());// 本地时间转时间戳long timestamp2 = ldt.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();long timestamp3 = ldt.toInstant(ZoneOffset.of("+08:00")).toEpochMilli();long timestamp4 = ldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();}