写点什么

java 时间日期类

作者:Java-fenn
  • 2022 年 9 月 14 日
    湖南
  • 本文字数:6823 字

    阅读完需:约 22 分钟

日期类一、Date 类 java.util.Date 类封装当前的日期和时间,精确到毫秒,其中 大部分方法都已过时


一)构造方法方法 描述 Date() 根据当前的默认毫秒值创建日期对象 Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间以来的指定毫秒数注意:标准基准时间也称为历元,即 1970 年 1 月 1 日 00:00:00 GMT(注意时差)// 分配一个 Date 对象,并初始化,以便它代表它被分配的时间,精确到毫秒 Date d = new Date();System.out.println(d);// 格式;2022 年 9 月 13 日 下午 12:51:46 此方法已过期 System.out.println(d.toLocaleString());// 分配一个 Date 对象,并将其初始化为表示从标准基准时间起指定的毫秒数 long date = 10006060;Date d2 = new Date(date);System.out.println(d2);二)常用方法方法 描述 long getTime(); 获取当前时间,以毫秒为单位 void setTime(long time); 设置时间 boolean after(Date when) 测试此日期是否晚于指定日期。boolean before(Date when) 测试此日期是否早于指定日期。int compareTo(Date anotherDate) 比较两个指定日期。boolean equals(Object obj) 比较两个相等的日期。//1 创建 Date 对象//今天 Date d=new Date();System.out.println(d.toLocaleString());//昨天 Date d2=new Date(d.getTime()-(606024*1000));System.out.println(d2.toLocaleString());//2 方法 after beforeboolean b1=d.after(d2);System.out.println(b1);boolean b2=d.before(d2);System.out.println(b2);


//比较 compareTo();int d3=d2.compareTo(d);System.out.println(d);//比较是否相等 equals()boolean b3=d.equals(d2);System.out.println(b3);三)Date 子类 java.util.Date 类的三个子类:


(1)java.sql.Date 只表示日期(JDBC 日期转义格式:yyyy-mm-dd)


(2)java.sql.Time 只表示时间(JDBC 时间转义格式:hh:mm:ss)


(3)java.sql.Timestamp 同时表示日期和时间(JDBC 时间戳转义格式:yyyy-mm-dd hh:mm:ss.fffffffff)


构造方法:


public Date(long time); 使用给定毫秒时间值构造一个 Date 对象


public Time(long time); 使用毫秒时间值构造 Time 对象


public Timestamp(long time); 使用毫秒时间值构造 Timestamp 对象


成员方法:


public static Date valueOf(String s); 把 JDBC 日期转义格式的字符串转换为 Date 值


public static Time valueOf(String s); 将使用 JDBC 时间转义格式的字符串转换为 Time 值


public static Timestamp valueOf(String s); 将使用 JDBC 时间戳转义格式的字符串转换为 Timestamp 值


public String toString();


使用 JDBC 日期转义格式对日期进行格式化


使用 JDBC 时间转义格式对时间进行格式化


使用 JDBC 时间戳转义格式编排时间戳


二、DateFormat 类概述: java.text.DateFormat 类是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间


DateFormat 类可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体的子类 SimpleDateFormat。Date -> String (格式化)Date date = new Date();// 指定输出的日期格式,获取日期格式化类对象 DateFormat bf = new SimpleDateFormat("yyyy-MM-dd E a HH:mm:ss");// 调用 format(Date date)方法,将传入的 date 按指定方式格式化 String format = bf.format(date);System.out.println(format);String -> Date (解析)Date date = new Date();// 指定输出的日期格式,获取日期格式化类对象 DateFormat bf = new SimpleDateFormat("yyyy-MM-dd E a HH:mm:ss");// 调用 format(Date date)方法,将传入的 date 按指定方式格式化 String format = bf.format(date);System.out.println(format);try {


// 调用parse(String)方法将字符串转为Date类型Date parse = bf.parse(format);System.out.println(parse);
复制代码


} catch (ParseException e) {


throw new RuntimeException(e);
复制代码


}三、SimpleDateFormat 类 java.text.SimpleDateFormat 类是以与语言环境有关的方式来格式化和解析日期的具体类。


**作用:**格式化时间,规定时间格式(一般使用它规定时间),可以把时间对象格式化成文本,把文本解析成时间对象


进行格式化(日期 -> 文本)、解析(文本 -> 日期)。一)构造方法方法名 说明 SimpleDateFormat() 构造一个 SimpleDateFormat,使用默认模式和日期格式 SimpleDateFormat(String pattern) 构造一个 SimpleDateFormat 使用给定的模式和默认的日期格式常用方法方法名 说明 final String format(Date date) 将日期格式化成日期/时间字符串 Date parse(String source) throws ParseException 从给定字符串开始解析文本,以生成一个日期注意:在把一个字符串解析为日期的时候,日期和时间模式必须和给定的字符串格式相匹配。时间模式字母字母 日期或时间 y 年 a 上/下午 am/pm 标记 M 年中月份 H 1 天中小时数(0-23)w 年中的周数 k 一天中的小时 (1-24)W 月中的周数 K 上午/下午一小时 (0-11)D 年中的天数 h 上午/下午一小时 (1-12)d 月中天数 m 分钟(小时)F 月中的星期几 s 秒 E 星期几名称(以星期为单位) S 毫秒 u 星期几(1 = 星期一,…,7 = 星期日) z 一般时区 Z RFC 822 时区 X ISO 8601 时区演示:String s = "2022 年 5 月 18 日 22:15:38 星期四 下午";// 当使用 SimpleDateFormat 将字符串转换为 Date 时,字符串格式必须与// SimpleDateFormat 构造器中定义的格式一致,标点符号和空格都必须一致,// 否则 parse 方法会抛出转换异常:java.text.ParseException:// Unparseable date: at DateFormat.parse(DateFormat.java:399)SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH:mm:ss E a");Date date = null;try {


// 调用parse(String)方法将字符串转为Date类型date = simpleDateFormat.parse(s);// 调用format(Date date)方法,将传入的date按指定方式格式化String format = simpleDateFormat.format(date);System.out.println(format);
复制代码


} catch (ParseException e) {


throw new RuntimeException(e);
复制代码


}System.out.println(date);四、Calendar 类概述: java.util.Calendar 类是一个抽象类,它提供了日期计算的相关功能、获取或设置各种日历字段的方法


protected Calendar() 构造方法为 protected 修饰,无法直接创建该对象一)常用字段(都是静态常量)字段 描述 YEAR 指示年的 get 和 set 的字段数字 MONTH 指月份的 get 和 set 的字段数字, 注意:月份从零开始,使用时要加一 DATE get 和 set 的字段数字,指示一个月中的某天 HOUR get 和 set 的字段数字,指示上午或下午的小时 MINUTE get 和 set 的字段数字,指示一小时中的分钟 SECOND get 和 set 的字段数字,指示一分钟中的秒二)常用方法方法名 说明 static Calendar getInstance() 使用默认时区和区域获取日历 void set(int year,int month,int date,int hourofday,int minute,int second) 设置日历的年、月、日、时、分、秒。int get(int field) 返回给定日历字段的值。字段比如年、月、日等 void set(int year, int month,int date); 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 void setTime(Date date) 用给定的 Date 设置此日历的时间。Date - >CalendarDate getTime() 返回一个 Date 表示此日历的时间。Calendar- >Datevoid add(int field,int amount) 按照日历的规则,给指定字段添加或减少时间量 long getTimeInMillis() 毫秒为单位返回该日历的时间值示例:public static void main(String[] args) {


/** * Calendar类的构造方法使用了protected方法修饰,所以不能直接使用构造方法创建对象 * 可以调用getInstance静态方法获取当前系统时间 */Calendar calendar = Calendar.getInstance() ;//获取当前系统时间System.out.println(calendar.getTime().toLocaleString());/** * get(要获取的时间):获取指定的时间 * 注意:语言的月份是从0开始的,即0~11代表常规的1~12月,所以要加1 */int year = calendar.get(Calendar.YEAR);//获取指定年份int month = calendar.get(Calendar.MONTH);//只能获取指定月份的上个月System.out.println(year + "年" + (month + 1) + "月");//(month + 1)获取当前系统月份/** * set(【年】,【月】,【日】,【时】,【分】,【秒】):设置时间 */calendar.set(Calendar.YEAR, Calendar.JUNE,Calendar.JUNE);//设置指定年月日System.out.println(calendar);//第二种方式Calendar calendar1 = Calendar.getInstance();calendar1.set(Calendar.MONTH,5);//要设置的是月份,把月份设为5月/** * add(要修改的时间,修改值):可以增加或减少时间,修改值为正,则加,为负数,就减 */calendar.add(Calendar.MONTH,5);//月份数加5calendar.add(Calendar.MONTH,-5);//月份数减5System.out.println(calendar);/** *getActualMaximum():获取时间的最大数 *getActualMinimum():获取时间的最小数 */calendar.getActualMaximum(Calendar.MONTH);//获取月份的最大数calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//获取当前月份的最大天数calendar.getActualMinimum(Calendar.MONTH);//获取月份的最小数/** * getTime():获取一个Date类型的时间 * setTime():用给定的Date类型设置此时间 */Date date = new Date();calendar.setTime(date);System.out.println(calendar.getTime());
复制代码


/***getTimeInMillis():获取从 1970 年至今的毫秒总数*/System.out.println( calendar.getTimeInMillis());


}需求:键盘录入年份,求当年二月份的最大天数 Scanner scanner = new Scanner(System.in);System.out.println("请输入年份:");int year = scanner.nextInt();Calendar calendar = Calendar.getInstance();calendar.set(year, 2, 1);//键盘输入年份,月份从 0 开始计算,设置为三月 calendar.add(Calendar.DAY_OF_MONTH,-1);// 从 3 月 1 日回推一天即为 2 月最后一天 int date = calendar.get(Calendar.DAY_OF_MONTH);System.out.println(year + "年 2 月份有" + date + "天");五、JDK8 第三代时间类 JDK 1.0 中包含了一个 java.util.Date 类,但是它的大多数方法已经在 JDK 1.1 引入 Calendar 类之后被弃用了。而 Calendar 也存在问题是:


​ 1)可变性:像曰期和时间这样的类应该是不可变的。


​ 2)偏移性:Date 中的年份是从 1970 开始的,而月份都从 0 开始。


​ 3)格式化:格式化只对 Date 有用,Calendar 则不行。


​ 4)此外,它们也不是线程安全的;不能处理闰秒等( 每隔 2 天,多出 1s )


为了解决此类问题,JDK 新增了 3 个时间日期类:LocalDateLocalTimeLocalDateTime 一)LocalDate 类 LocalDate 是表示日期(通常视为年-月-日)的不可变日期时间对象, 采用了系统的默认时区 。只包含日期,可以获取日期字段


1、常用方法方法 描述 static LocalDate now() 从默认时区的系统时钟中获取当前日期 static LocalDate now(ZoneId zone) 从指定时区的系统时钟中获取当前日期 static LocalDate of(int year, int month, int dayOfMonth) 指定年、月、日 String format(DateTimeFormatte formatter) 使用指定的格式化程序设置此日期的格式 getYear() 获取年份信息 getMonth() 获取月份信息(月份英文名)getMonthValue() 获取月份信息(月份值)getDayOfMonth() 获取日期信息 getDayOfWeek() 获取日期信息(英文名)getDayOfYear() 获取这一年的第几天 withYear(int) 设置年 withMonth(int) 设置月 withDayOfMonth(int) 设置日 withDayOfYear(int) 设置年中第几天 plusXXXs(long) 将当前年、月、日、星期后移指定值,如: 当前 2022 年,年份加两年:plusYears(2) ==> 2024 年 minusXXXs(long) 将当前年、月、日、星期前移指定值,即减去指定的年、月、日、周数 DateTimeFormatter 类 DateTimeFormatter 是时间格式化类。


public static void main(String[] args) {


//创建DateTimeFormatterDateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");//1 把时间格式化成字符串String format = dtf.format(LocalDateTime.now());System.out.println(format);//2 把字符串解析成时间LocalDateTime localDateTime = LocalDateTime.parse("2020/03/10 10:20:35", dtf);System.out.println(localDateTime);
复制代码


}注意: DateTimeFormatter 格式化类与 SimpleDateFormat 类相似,其 ofPattern()方法传入的参数与 SimpleDateFormat.format()传入的参数格式类似,如:DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日 E") ,但是要注意调用该方法的是哪个类,比如调用类是 LocalDate 类,此时不要传入与时间相关的,因为 LocalDate 类不能获取时间


二)LocalTime 类 LocalTime 类表示一天中的时间,只包含时间,可以获取时间字段


1、常用方法方法 描述 static LocalTime now() 从默认时区的系统时钟中获取当前时间 static LocalTime now(ZoneId zone) 从指定时区的系统时钟中获取当前时间 static LocalTime of(int hour, int minute, int second,int nanoOfSecond) 指定时、分、秒、纳秒 String format(DateTimeFormatte formatter) 使用指定的格式化程序设置此日期的格式 getHour() 获取小时信息 getMinute() 获取分钟信息 getSecond() 获取秒 getNano() 获取纳秒 withHour(int) 设置小时 withMinute(int) 设置分钟 withSecond(int) 设置秒 withNano(int) 设置纳秒 plusXXXs(long) 将当前时、分、秒、纳秒后移指定值,如: 当前 22 点,小时加两小时:plusHours(2) ==> 0 点 minusXXXs(long) 将当前时、分、秒、纳秒前移指定值,即减去指定的时、分、秒、纳秒数三)LocalDateTime 类日期 + 时间,可以获取日期和时间字段,表示本地日期时间,默认使用系统时区


1、常用方法方法 描述 static LocalDateTime now() 从默认时区的系统时钟中获取当前日期时间。static LocalDateTime now(ZoneId zone) 从指定时区的系统时钟中获取当前日期时间 static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) 指定年、月、日、时、分、秒、纳秒 String format(DateTimeFormatte formatter) 使用指定的格式化程序设置此日期时间的格式 getXXX() 分别获取年、月(英文名)、时、分、秒、纳秒 getMonthValue() 获取 1~12 之间的月份值 getDayOfMonth() 获取“月份中的某一天”字段 getDayOfWeek() 获取星期几的英文名 getDayOfYear() 获取“一年中的某一天”字段 withXXX(int) 设置年、月、时、分、秒、纳秒 withDayOfMonth(int) 设置日期 withDayOfYear(int) 设置一年中的多少天 plusXXXs(long) 将当前年、月、日、时、分、秒、纳秒、周数后移指定值,如: 当前 22 点,小时加两小时:plusHours(2) ==> 0 点 minusXXXs(long) 将当前年、月、日、时、分、秒、纳秒、周数前移指定值,即减去指定的年、月、日、时、分、秒、纳秒、周数 public static void main(String[] args) {


  //1创建本地时间  LocalDateTime localDateTime=LocalDateTime.now();  //LocalDateTime localDateTime2=LocalDateTime.of(year, month, dayOfMonth, hour, minute)  System.out.println(localDateTime);  System.out.println(localDateTime.getYear());  System.out.println(localDateTime.getMonthValue());  System.out.println(localDateTime.getDayOfMonth());    //2添加两天  LocalDateTime localDateTime2 = localDateTime.plusDays(2);  System.out.println(localDateTime2);    //3减少一个月  LocalDateTime localDateTime3 = localDateTime.minusMonths(1);  System.out.println(localDateTime3);}
复制代码


四)Instant 时间戳类 Instant 表示瞬间,和前面 Date 类相似。


相较于 System.currentTimeMillis()获取到【毫秒】,Instant 可以更为精确的获取到【纳秒】。Instant 提供了大量与 Date 相互转换的方法


public static void main(String[] args) {


//1 创建Instant:时间戳Instant instant=Instant.now();System.out.println(instant.toString());System.out.println(instant.toEpochMilli());System.out.println(System.currentTimeMillis());//2 添加减少时间
Instant instant2 = instant.plusSeconds(10);
System.out.println(Duration.between(instant, instant2).toMillis());
//1 Date --->Instant--->LocalDateTimeSystem.out.println("-------------Date --->Instant---->LocalDateTime-----------");Date date=new Date();Instant instant3 = date.toInstant();System.out.println(instant3);
// ZoneId类是时区类LocalDateTime localDateTime = LocalDateTime.ofInstant(instant3, ZoneId.systemDefault());System.out.println(localDateTime);
//2 LocalDateTime --->Instant--->DateSystem.out.println("-------------LocalDateTime --->Instant---->Date-----------");
Instant instant4 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();System.out.println(instant4);Date from = Date.from(instant4);System.out.println(from);
复制代码


用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
java时间日期类_Java_Java-fenn_InfoQ写作社区