概括

到JDK1.8为止,Java关于时间与日期的操作已经更新了3代。

  • Date
  • Calendar
  • JDK8提供的新API
    • LocalDate
    • LocalTime
    • LocalDateTime
    • ZonedDateTime

:::success 关于时间操作的详细API,可以去看API手册。
搜索这些

  • Date:时间类,毫秒级,功能很少,很多都废了
  • Calendar:日历类,可以用来计算时间,得到年月日时分秒等数据
  • LocalDateTime:新的时间类,更简单的计算时间,更简单的得到拆分的时间信息,更推荐
  • SimpleDateFormat :Date格式化
  • DateTimeFormatter :LocalDateTime格式化 :::

    获取当前时间

    (1)System.currentTimeMillis()

    获取标准时间,此方法优势是不受时区的影响,但是得到结果是时间戳的格式。
    1. System.currentTimeMillis();

    (2)Date

    ```java //获取当前系统时间,Date是这种格式的:Mon Jan 01 10:20:30 CST 1996 Date d1 = new Date();

//通过指定毫秒数得到时间,传入当前时间戳,得到当前时间 Date d2 = new Date(923456723234L);

  1. <a name="CD0jM"></a>
  2. ## (3)Calendar
  3. ```java
  4. //得到一个日历对象
  5. Calendar calendar= Calendar.getInstance();
  6. //得到当前时间
  7. Date date = calendar.getTime();
  8. //得到当前时间戳,从1970-01-01 0:0:0到现在的毫秒数
  9. long millis = calendar.getTimeInMillis();

(4)LocalDate/Time

  1. //只有日期,没有时间:2022-08-13
  2. LocalDate date = LocalDate.now();
  3. //只有时间,没有日期:22:47:16.854
  4. LocalTime time = LocalTime.now();
  5. //时间日期都有:2022-08-13T22:47:16.854
  6. LocalDateTime dateTime = LocalDateTime.now();
  7. //获取当前日期时间还有时区信息:2022-08-13T22:49:16.886+08:00[Asia/Shanghai]
  8. //ZonedDateTime 一般是不可改变的,这意味着该类的对象执行计算的所有方法都会返回一个新的 ZonedDateTime 实例
  9. ZonedDateTime zonedDateTime = ZonedDateTime.now();

(5)Instant

  1. Instant now = Instant.now();

格式化日期时间成字符串

(1)SimpleDateFormat

  1. Date d1 = new Date();
  2. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
  3. //format:将日期转换成指定格式的字符串,传入一个Date类型就行了
  4. String format = sdf.format(d1);

(2)DateTimeFormatter

  1. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
  2. LocalDateTime dateTime = LocalDateTime.now();
  3. //jdk1.8的新时间那几个有一个format方法,传入一个DateTimeFormatter对象,就行时间格式化成字符串
  4. String format = dateTime.format(formatter);

字符串转成时间对象

(1)转换为Date

  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
  2. //要被转换的日期字符的格式要和sdf定义的一样
  3. String s = "1996年01月01日 10:20:30 星期一";
  4. Date parse = sdf.parse(s);

(2)转换为LocalDate/Time

  1. String s = "1996-01-01T10:20:30";
  2. //s是LocalDateTime的默认格式的字符串
  3. //parse还可以传入一个DateTimeFormatter对象用来指定日期格式,
  4. LocalDateTime dateTime = LocalDateTime.parse(s);
  5. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
  6. String s1 = "1996/01/01";
  7. LocalDate date = LocalDate.parse(s,formatter);
  8. //Local系列都是通过parse把字符串变成时间的

得到年月日时分秒信息

(1)LocalDate/Time

image.png

(2)Calendar

  1. Calendar calendar = Calendar.getInstance();
  2. calendar.get(Calendar.YEAR); //获取年份
  3. calendar.get(Calendar.MONTH)+1; //获取月份
  4. calendar.get(Calendar.DATE); //获取日
  5. calendar.get(Calendar.HOUR); //时(12小时制)
  6. calendar.get(Calendar.HOUR_OF_DAY); //时(24小时制)
  7. calendar.get(Calendar.MINUTE); //分
  8. calendar.get(Calendar.SECOND); //秒
  9. calendar.get(Calendar.DAY_OF_WEEK); //一周的第几天
  10. //还有很多常量参数,可以自己去看

时间日期的计算

(1)用时间戳加减

有好几种得到时间戳的方法,两个时间戳相减/相加得到一个时间戳,转换成时间。

(2)Calendar

  1. Calendar calendar = Calendar.getInstance();
  2. //当前时间+3月
  3. calendar.add(Calendar.MONTH, 3);
  4. //再+5天
  5. calendar.add(Calendar.DAY_OF_YEAR, 5);
  6. //再-80年
  7. calendar.add(Calendar.YEAR, -80);
  8. //再+10小时
  9. calendar.add(Calendar.HOUR_OF_DAY,10);

(3)LocalDate/Time

image.png
image.png