当前位置: 代码迷 >> 综合 >> 日期操作类(Date,DateFormat,Calender,其他日期类)
  详细解决方案

日期操作类(Date,DateFormat,Calender,其他日期类)

热度:84   发布时间:2024-01-19 14:04:20.0

日期操作类 Date

一.Date java.util包

  • Date是用来表示时间的类,时间精确到毫秒 。现在使用的时间是从1970.1.1

1.构造方法

  1. Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
  2. Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
  3. Date(String s) 已过时。 从 JDK 1.1 开始,由 DateFormat.parse(String s) 取代。

2.常用方法

  1. long
    getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
  2. int
    getYear() 返回自日期表示的年份减去 1900。
  3. int
    getMonth() 返回的是此日期所表示的月份(0–11)
  4. int
    getDay() 返回的是此日期所表示的一周中的某一天。
  5. int
    getHours() 返回的是此日期所表示的小时
  6. int
    getMinutes() 返回的是此日期所表示的小时已经过去的分钟数。
  7. boolean
    after(Date when) 测试此日期是否在指定日期之后。
  8. 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.常用方法

  1. String
    format(Date date) 将一个 Date 格式化为日期/时间字符串。date —>String
  2. 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.日历格式的时间的对象,属性

  1. static Calendar
    getInstance() 使用默认时区和语言环境获得一个日历。
  2. static int
    DAY_OF_MONTH get 和 set 的字段数字,指示一个月中的某天。
  3. static int
    DAY_OF_WEEK get 和 set 的字段数字,指示一个星期中的某天。
  4. static int
    DAY_OF_WEEK_IN_MONTH get 和 set 的字段数字,指示当前月中的第几个星期。
  5. static int
    DAY_OF_YEAR get 和 set 的字段数字,指示当前年中的天数。
  6. static int
    HOUR get 和 set 的字段数字,指示上午或下午的小时。
  7. static int
    HOUR_OF_DAY get 和 set 的字段数字,指示一天中的小时。
  8. static int
    MINUTE get 和 set 的字段数字,指示一小时中的分钟。
  9. static int
    MONDAY 指示 Monday 的 DAY_OF_WEEK 字段值。
  10. static int
    MONTH 指示月份的 get 和 set 的字段数字。
  11. static int
    SECOND get 和 set 的字段数字,指示一分钟中的秒。
  12. static int
    WEEK_OF_MONTH get 和 set 的字段数字,指示当前月中的星期数。
  13. static int
    WEEK_OF_YEAR get 和 set 的字段数字,指示当前年中的星期数。
  14. 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.常用方法

  1. abstract void
    add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  2. int
    get(int field) 返回给定日历字段的值。
  3. void
    set(int field, int value) 将给定的日历字段设置为给定值。
  4. void
    set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
  5. void
    set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
  6. 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));}
  1. 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

属性

  1. static int
    MAX_VALUE 最大支持的一年,“999999999”。
  2. static int
    MIN_VALUE 最低支持的一年,“- 999999999”。

方法

  1. static Year
    now() 从默认时区中的系统时钟获取当前年份。
  2. static Year
    now(Clock clock) 从指定的时钟获取当前年份。
  3. static Year
    of(int isoYear) 获得 Year实例。
  4. boolean
    isAfter(Year other) 是今年指定的一年后。
  5. boolean
    isBefore(Year other) 是今年前指定的一年。
  6. int
    length() 获取这一年的长度。
  7. 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

方法

  1. static Month
    of(int month) 获得 Month实例从一个 int价值。
  2. int
    length(boolean leapYear) 获取本月的长度。
  3. int
    maxLength() 获取这个月的最大长度。
  4. int
    minLength() 获取这个月的最小长度。
  5. static Month
    of(int month) 获得 Month实例从一个 int价值。
  6. Month
    plus(long months) 返回一年的月,是指定数量的后,这一个。
  7. 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

方法

  1. String
    toString() 输出为 String今年月,如 2007-12。
  2. static YearMonth
    of(int year, int month) 获得 YearMonth实例从年月。
    3.static YearMonth
    now() 从默认时区中获得当前年月的时间。
  3. 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.属性

  1. static LocalDate
    MAX 所支持的最大 LocalDate,’ + 999999999 -12-31”。
  2. 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.方法

  1. static LocalDate
    of(int year, int month, int dayOfMonth) 获得 LocalDate实例从一年、月、日。
  2. static LocalDate
    now() 在默认时区中从系统时钟获取当前日期。
  3. String
    toString() 输出该日期作为 String,如 2007-12-03。
  4. String
    format(DateTimeFormatter formatter) 使用指定的格式的日期格式。
  5. 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.属性

  1. static LocalTime
    MAX 所支持的最大 LocalTime,“23:59:59. 999999999。
  2. static LocalTime
    MIDNIGHT 在一天的开始,午夜时分,“00:00”。
  3. static LocalTime
    MIN 最小支持 LocalTime 00:00,’ '。
  4. 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.方法

  1. static LocalTime
    now() 在默认时区中从系统时钟获取当前时间。
  2. static LocalTime
    of(int hour, int minute, int second) 获得 LocalTime实例从一个小时、分钟和秒。
  3. int
    toSecondOfDay() 提取时间为秒的日子,从 0到 24 * 60 * 60 - 1。
  4. 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.属性

  1. static LocalDateTime
    MAX 所支持的最大 LocalDateTime,’ + 999999999 -12-31t23:59:59. 999999999。
  2. 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.方法

  1. static LocalDateTime
    now() 从默认时区中的系统时钟中获取当前日期时间。
  2. static LocalDateTime
    of(int year, int month, int dayOfMonth, int hour, int minute) 获得 LocalDateTime从年,月,日的一个实例,小时和分钟,设置第二和纳秒到零。
  3. 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时间戳

  1. static Instant
    now() 从系统时钟中获得当前时刻。
  2. 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)时间间隔

常用方法

  1. static Duration
    between(Temporal startInclusive, Temporal endExclusive) 获得 Duration表示两个时间对象之间的时间。
  2. int
    getNano() 得到的纳秒数在第二在这个时间。
  3. long
    getSeconds() 获取在此期间的秒数。
  4. long
    toDays() 获取在此期间的天数。
  5. long
    toHours() 获取在此期间的几个小时数。
  6. long
    toMillis() 将此持续时间转换为毫秒内的总长度。
  7. long
    toMinutes() 获取在此期间的分钟数。
  8. long
    toNanos() 将这个时间的总长度来表示为一个 long。
  9. 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)日期间隔

  1. static Period
    between(LocalDate startDateInclusive, LocalDate endDateExclusive) 获得由年数 Period月,和两个日期之间的天数。
  2. int
    getYears() 获取此期间的年数。
  3. int
    getDays() 获取此期间的天数。
  4. int
    getMonths() 获取此期间的月数。
  5. 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.常用方法

  1. abstract Instant
    instant() 获取时钟的当前时刻。
  2. long
    millis() 获取时钟的当前毫秒瞬间。
  3. 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();}
  相关解决方案