日期类
第一代日期类:
1、Date:精确到毫秒,代表特定的瞬间
2、SimpleDateFormat: **格式化和解析日期的具体类,**它允许进行:格式化(日期 → 文本) 解析(文本 → 日期) 和 规范化。
3、常用的使用方法
import java.text.SimpleDateFormat;
import java.util.Date;public class Date01 {public static void main(String[] args) throws Exception {// 选取当前系统时间// 默认输出的日期格式为国外的方式,因此进行日期转换。Date date = new Date();System.out.println("当前的日期格式为:" + date);// 通过制定毫秒数,来得到毫秒对应的时间Date date1 = new Date(12341341341L);System.out.println("毫秒对应的日期为:" + date1);// 通过SimpleDateFormat对象,来指定相应的格式。// 对象中的格式是固定好的。按照对应的格式来进行声明SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");String format = sdf.format(date);System.out.println("当前日期:" + format);// 可以把一个格式化的String, 转换为对应的Date。// 1、注意String中的时间格式和SimpleDateFormat中的格式要一致,否则抛出转换异常// 2、默认转换后的时间格式为国外的形式,如果转为国内的话,使用SimpleDateFormat.format方法String s = "2023年02月25日 16:17:52 周六";Date parseDate = sdf.parse(s);System.out.println("String to Date: " + parseDate);System.out.println("String to format Date: " + sdf.format(parseDate));}
}
第二代日期类
1、Calendar类(日历)
public abstract class Calendar implements Serializable, Cloneable, Comparable
2、Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
3、Calendar是一个抽象类,并且构造器为 private, 可以通过getInstance()来创建实例
import java.util.Calendar;public class Calendar01 {public static void main(String[] args) {//老韩解读//1. Calendar是一个抽象类, 并且构造器是private//2. 可以通过 getInstance() 来获取实例//3. 提供大量的方法和字段提供给程序员//4. Calendar没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活)//5. 如果我们需要按照 24小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAYCalendar c = Calendar.getInstance(); //创建日历类对象//比较简单,自由System.out.println("c=" + c);//2.获取日历对象的某个日历字段System.out.println("年:" + c.get(Calendar.YEAR));// 这里为什么要 + 1, 因为Calendar 返回月时候,是按照 0 开始编号System.out.println("月:" + (c.get(Calendar.MONTH) + 1));System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));System.out.println("小时:" + c.get(Calendar.HOUR));System.out.println("分钟:" + c.get(Calendar.MINUTE));System.out.println("秒:" + c.get(Calendar.SECOND));//Calender 没有专门的格式化方法,所以需要程序员自己来组合显示System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) +" " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) );}
}
第三代日期类
之前两代的不足
1、可变性:像日期和时间这样的类应该是不可变的
2、偏移性:Date中的年份是从1900开始的,而月份都从0开始
3、格式化:格式化只对Date有用,而Calendar不能使用
4、前面两代不是线程安全的,不能处理闰秒等(每隔两天,多出1s)。
LocalDate、LocalTime、LocalDateTime
-
LocalDate: 只包含日期,可以获取年月日字段
-
LocalTime: 只包含时间,可以获取时分秒字段
-
LocalDateTime: 包含日期 + 时间,可以同时包含 年月日 时分秒 字段
// 返回当前日期时间的对象
LocalDateTime ldt = LocalDateTime.now(); // LocalDate.now(); LocalTime.now();
System.out.println(ldt);// 返回年月日时分秒
System.out.println("年:" + ldt.getYear());
System.out.println("英文月:" + ldt.getMonth());
System.out.println("数字月:" + ldt.getMonthValue());
System.out.println("日:" + ldt.getDayOfMonth());
System.out.println("时:" + ldt.getHour());
System.out.println("分:" + ldt.getMinute());
System.out.println("秒:" + ldt.getSecond());
DateTimeFormatter:格式日期类
//创建对象:DateTimeFormatter
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH小时mm分钟ss秒");
String format = dtf.format(ldt);
System.out.println("格式化之后的日期为:" + format);
Instant 时间戳
类似于 Date, 提供了一系列的和Date类转换的方式
-
Instant → Date
Date date = Date.from(instant);
-
Date → Instant
Instant instant = date.toInstant();
// 创建 Instant 值
Instant now = Instant.now();
// Instant 获取时间戳
System.out.println(now.atZone(ZoneId.systemDefault()));
// Instant -> Date
Date date = Date.from(now);// Date 获取时间戳
System.out.println(date.getTime());
// Date -> Instant
Instant instant = date.toInstant();System.out.println(date);
System.out.println(instant);
更多方法
- 提供 plus 和 minus方法可以对当前时间进行加或者减
LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH小时mm分钟ss秒");//提供 plus 和 minus方法可以对当前时间进行加或者减
//看看890天后,是什么时候 把 年月日-时分秒
LocalDateTime localDateTime = ldt.plusDays(890);
System.out.println("890天后=" + dtf.format(localDateTime));//看看在 3456分钟前是什么时候,把 年月日-时分秒输出
LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
System.out.println("3456分钟前 日期=" + dtf.format(localDateTime2));
练习题
public class Exercise01 {public static String reverse(String str, int start, int end) {if (!(str != null && start > 0 && end > start && end < str.length())) {throw new RuntimeException("参数不正确");}char[] strArray = str.toCharArray();for (int i = start, j = end; i < j; i++, j--) {char temp = strArray[i];strArray[i] = strArray[j];strArray[j] = temp;}return new String(strArray);}public static void main(String[] args) {String s = "abcdef";try {System.out.println(reverse(s, 1, 89));} catch (Exception e) {System.out.println(e.getMessage());}}
}