Java 中的日期与时间处理!

你的名字 2022-09-17 01:57 330阅读 0赞

前言

学习 Java 的过程中,难免会跟时间处理打交道,那我们今天就来看看,Java 中最常见的一些日期和时间处理的知识。

基本概念

本地时间

即所处地区所处时区的时间;

时区

要准确表达时间,还要依赖时区,时区表达方式主要有如下三种:

  • GMTUTC 加时区偏移表示 ,如 GMT+08:00 表示东八区;
  • 缩写 ,如 CST 表示中国标准世界,但同时也表示美国中部时间;
  • 洲 / 城市,如 Asia/Shanghai

本地化

使用 Locale 表示一个国家或地区的日期、时间、数字、货币等格式,由 语言_国家 的字母缩写构成;

Date 和 Calendar

时间戳

Epoch Time ,即时间戳,在不同编程语言中有如下几种存储方式:

  • 以秒为单位的整数,缺点是只能精确到秒;
  • 以毫秒为单位的整数,最后 3 位表示毫秒数;
  • 以秒为单位的浮点数,小数点后表示零点几秒;

标准库 API

主要提供了两套处理时间和日期的 API:

  • 定义在 java.util 中,主要包括 Date、Calendar、TimeZone 这几个类;
  • 定义在 java.time 中,主要包括 LocalDateTime、ZoneDateTime、ZoneId 等,自 Java 8 引入;

Date

  • 基本用法

    import java.util.*;

    public class Main{

    1. public static void main(String[] args) throws Exception{
    2. // 获取当前时间
    3. Date date = new Date();
    4. // 年份
    5. System.out.println(date.getYear() + 1900);
    6. // 月份
    7. System.out.println(date.getMonth() + 1);
    8. // 日期
    9. System.out.println(date.getDate);
    10. // 转换为本地时间
    11. System.out.println(date.toLocaleString());
    12. // 转换为 GMT 时区
    13. System.out.println(date.toGMTString());
    14. }

    }

  • 预定义的字符串

    • yyyy:年
    • MM:月
    • dd:日
    • HH:小时
    • mm:分钟
    • ss:秒
  • 存在的问题

    • 不能转换时区;
    • 无法对日期和时间进行运算操作;

Calendar

可用于获取并设置年、月、日、时、分、秒,比 Date 多了一个可以作简单日期和时间运算的功能;

  • 基本用法

    import java.util.*;

    public class Main{

    1. public staitc void main(String[] args) throws Exception{
    2. // 获取当前时间
    3. Calendar cal = Calendar.getInstance();
    4. // 获取年、月、日、时、分、秒
    5. int year = cal.get(Calendar.YEAR);
    6. int month = cal.get(Calendar.MONTH);
    7. int day = cal.get(Calendar.DAY_OF_MONTH);
    8. int hour = cal.get(Calendar.HOUR_OF_DAY);
    9. int minute = cal.get(Calendar.MINUTE);
    10. int second = cal.get(Calendar.SECOND);
    11. }

    }

  • 利用 getTime() 方法,可以将一个 Calendar 对象转换为 Date 对象,然后利用 SimpleDateFormat 进行格式化;

TimeZone

相较于 DateCalendar ,提供了时区转换功能,主要步骤如下:

  1. 清除所有字段;
  2. 设定指定时区;
  3. 设定日期和时间;
  4. 创建 SimpleDateFormat 并设定目标时区;
  5. 格式化获取的 Date 对象(对象无时区信息,时区信息存储在 SimpleDateFormat 中);

    import java.util.;
    import java.text.
    ;

    public class Main{

    1. public static void main(String[] args) throws Exception{
    2. Calendar cal = Calendar.getInstance();
    3. cal.clear();
    4. // 设定时区
    5. cal.setTimeZone(TimZone.getTimeZone("Asia/Shanghai"));
    6. // 设定时间
    7. cal.set(2020, 3 /* 4 月 */, 25, 13, 30, 0);
    8. // 显示时间:
    9. var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    10. sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    11. System.out.println(sdf.format(c.getTime()));
    12. }

    }

LocalDateTime

  • Java 8 引入 java.time 中所提供的新的时间和日期 API,主要涉及的类型:

    • 本地日期和时间:LocalDateTime、LocalDate、LocalTime
    • 带时区的日期和时间:ZonedDateTime
    • 时刻:Instant
    • 时区:ZoneId、ZoneOffset
    • 时间间隔:Duration
    • 格式化:DateTimeFormatter
  • 基本用法

    import java.time.*;

    public class Main{

    1. public static void main(String[] args) throws Exception{
    2. // 当前日期
    3. LocalDate date = LocalDate.now();
    4. // 当前时间
    5. LocalTime time = LocalTime.now();
    6. // 当前日期和时间
    7. LocalDateTime dateTime = LocalDateTime.now();
    8. }

    }

  • 输出标准为 ISO 8601,日期和时间之间的分割符是 T ,规定的标准格式如下:

    • 日期:yyyy-MM-dd
    • 时间:HH:mm:ss
    • 带毫秒的时间:HH:mm:ss.SSS
    • 日期和时间:yyyy-MM-dd T HH:mm:ss
    • 带毫秒的日期和时间:yyyy-MM-dd T HH:mm:ss.SSS
  • 对日期和时间进行调整:

    • 年:withYear()
    • 月:withMonth()
    • 日:withDayOfMonth()
    • 时:withHour()
    • 分:withMinute()
    • 秒:withSecond()
  • DurationPeriod

    • Duration:表示两个时刻间的时间间隔;
    • Period:表示两个日期之间的天数;

ZonedDateTime

用于表示带时区的日期和时间;

  • 时区转换及本地时间转换

    import java.time.*;

    public class Main{

    1. public static void main(String[] args) throws Exception{
    2. ZonedDateTime zoneTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
    3. // 中国时区转换为纽约时间
    4. ZonedDateTime newZoneTime = zoneTime.withZoneSameInstant(ZoneId.of("America/New_York"));
    5. // 转换为本地时间
    6. LocalDateTime local = zoneTime.toLocalDateTime();
    7. System.out.println(zoneTime);
    8. System.out.println(newZoneTime);
    9. }

    }

DateTimeFormatter

相较于 SimpleDateFormatDateTimeFormatter 不仅是不变对象,还是线程安全的,有如下两种使用方式;

  • 传入格式化字符串

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”)

  • 传入格式化字符串同时指定 Locale

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“E, yyyy-MM-dd HH:mm:ss”, Locale.US)

  • 对比效果

    import java.time.;
    import java.time.format.
    ;
    import java.util.Locale;

    public class Main{

    1. public static void main(String[] args) throws Exception{
    2. ZonedDateTime zdt = ZonedDateTime.new();
    3. var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm ZZZZ");
    4. System.out.println(formatter.format(zdt));
    5. var zhFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd EE HH:mm", Locale.CHINA);
    6. System.out.println(zhFormatter.format(zdt));
    7. var usFormatter = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy EE HH:mm", Locale.US);
    8. System.out.println(usFormatter.format(zdt));
    9. }

    }

Instance

时间戳在 java.time 中用 Instant 类型表示,相当于 java.util 中的 currentTimeMills() ,返回以毫秒表示的当前时间戳;

  • Instant 内部核心字段

    public final class Instant implements …{

    1. private final long seconds;
    2. private final int nanos;

    }

  • LocalDateTie、ZoneId、Instant、ZonedDateTime、long 之间相互转换关系;

    35fd031e0a9bd9b76643a6e4dc100719.png

总结

以上就是 Java 中关于日期和时间的相关学习笔记了,如果你觉得我整理的笔记对你也有用,那就点个赞再走吧!

发表评论

表情:
评论列表 (有 0 条评论,330人围观)

还没有评论,来说两句吧...

相关阅读