一:第一代日期类

image.png

  1. Date: 精确到毫秒,代表特定的时间
  2. SimpleDateFormat: 格式化和解析日期的具体类。他允许进行格式化(日期 -> 文本)和规范化

    1. public class Test00 {
    2. public static void main(String[] args) {
    3. //1: 获取当前的时间
    4. //2: 这里的Date类是在Java.util包
    5. //3: 默认输出的日期格式是国外的方式,因此通常需要对格式进行装换
    6. Date time = new Date();
    7. System.out.println(time);
    8. //1: 创建 SimpleDateFormat 对象,可以指定相应的格式
    9. //2. 这里的格式使用的字母是规定好,不能乱写
    10. //3: 先指定格式,然后将time放到指定的格式里面用字符输出
    11. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
    12. String format = simpleDateFormat.format(time);
    13. System.out.println(format);
    14. //可以把一个格式化的 String 转成对应的 Date
    15. String s = "1996年01月01日 10:20:30 星期一";
    16. //转回外国的形式
    17. Date time2 = simpleDateFormat.parse(s);
    18. System.out.println(time2);
    19. //再转回来
    20. System.out.println(simpleDateFormat.format(time2));
    21. }
    22. }

    二:第二代日期类

  3. 第二代日期类,主要就是Canlendar类( 日历 )

  4. Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH.DAY_OF MONTH、HOUR等日历室段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

    1. public class Test01 {
    2. public static void main(String[] args) {
    3. //1. Calendar 是一个抽象类, 并且构造器是 private
    4. //2. 可以通过 getInstance() 来获取实例
    5. Calendar calendar = Calendar.getInstance();
    6. //直接输入的话,会包含全部的字段,并且看不懂
    7. System.out.println(calendar);
    8. //获取日历对象的某个日历字段
    9. System.out.println("年:" + calendar.get(Calendar.YEAR));
    10. System.out.println("月:" + (calendar.get(Calendar.MONTH) + 1));
    11. System.out.println("日:" + calendar.get(Calendar.DAY_OF_MONTH));
    12. System.out.println("小时:" + calendar.get(Calendar.HOUR));
    13. System.out.println("分钟:" + calendar.get(Calendar.MINUTE));
    14. System.out.println("秒:" + calendar.get(Calendar.SECOND));
    15. //也可以自己组合显示内容
    16. System.out.println(calendar.get(Calendar.YEAR) + "-"
    17. + (calendar.get(Calendar.MONTH) + 1)
    18. + "-"
    19. + calendar.get(Calendar.DAY_OF_MONTH));
    20. }
    21. }

    :::info 存在的问题是:
    可变性:像日期和时间这样的类应该是不可变的
    便宜性:Date中的年份是从1900开始的,而月份都从0开始。
    格式化:格式化只对Date有用,Calendar则不行。
    此外,它们也不是线程安全的;不能处理闰秒等(每隔2天,多出1s)。 :::

    三:第三代日期类

    image.png

    1. public class Test01 {
    2. public static void main(String[] args) {
    3. //1. 使用 now() 返回表示当前日期时间的 对象
    4. LocalDateTime time = LocalDateTime.now();
    5. System.out.println(time);
    6. LocalDate time2 = LocalDate.now();
    7. System.out.println(time2);
    8. LocalTime time3 = LocalTime.now();
    9. System.out.println(time3);
    10. System.out.println("年=" + time.getYear());
    11. System.out.println("月=" + time.getMonth());
    12. System.out.println("月=" + time.getMonthValue());
    13. System.out.println("日=" + time.getDayOfMonth());
    14. System.out.println("时=" + time.getHour());
    15. System.out.println("分=" + time.getMinute());
    16. System.out.println("秒=" + time.getSecond());
    17. }
    18. }

    四:DateTimeFormatter格式日期类

    1. public class Test00 {
    2. public static void main(String[] args) {
    3. LocalDateTime time = LocalDateTime.now();
    4. //首先创建一个DateTimeFormatter对象
    5. DateTimeFormatter dateTimeFormatter =
    6. DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    7. //将时间转换成指定的格式,然后用字符船接收
    8. String Time1 = dateTimeFormatter.format(time);
    9. System.out.println(Time1);
    10. }
    11. }

    五:Instant时间戳

    1. public class Test01 {
    2. public static void main(String[] args) {
    3. //1.通过 静态方法 now() 获取表示当前时间戳的对象
    4. Instant now = Instant.now();
    5. System.out.println(now);
    6. //2.通过from可以把Instant转成Date
    7. Date date = Date.from(now);
    8. //3. 通过 date 的 toInstant() 可以把 date 转成 Instant 对象
    9. Instant instant = date.toInstant();
    10. System.out.println(instant);
    11. }
    12. }

    六:第三代日期类的更多方法

    1. public class Test01 {
    2. public static void main(String[] args) {
    3. //提供 plus 和 minus 方法可以对当前时间进行加或者减
    4. //看看 890 天后,是什么时候 把 年月日-时分秒
    5. LocalDateTime localDateTime1 = localDateTime.plusDays(890);
    6. System.out.println("890 天后= " + localDateTime);
    7. //看看在 3456 分钟前是什么时候,把 年月日-时分秒输出
    8. LocalDateTime localDateTime2 = localDateTime.minusMinutes(3456);
    9. System.out.println("3456 分钟前 日期= " + localDateTime2);
    10. }
    11. }