java · 2024-06-30 0

JSR310 日期

一、日期区别

1.pom 依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!--<version>8.0.22</version>-->
    <version>8.0.33</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

2.表结构

CREATE TABLE `tbl` (
`date_1` date,
`time_1` time,
`datetime_1` datetime,
`timestamp_1` timestamp
);

3.日期区别

  1. java.util.Date 可表示 可表示 year-month-date hour:minute:sec
  2. java.sql.Date 可表示 year-month-date
  3. java.sql.Timestamp 可表示 year-month-date hour:minute:sec.nano
@Test
public void testDate() {
    // month 0 to 11. day 1 to 31.
    // 可表示 year-month-date hour:minute:sec
    java.util.Date date1 = new java.util.Date(2024, 7, 12, 0 , 0, 0);
    // month 0 to 11. day 1 to 31.
    // 可表示 year-month-date
    java.sql.Date date2 = new java.sql.Date(2024, 7, 12);
    // 可表示 hour:minute:second
    java.sql.Time time2 = new java.sql.Time(0, 0, 0);
    // nano 0 to 999,999,999
    // 可表示 year-month-date hour:minute:sec.nano
    java.sql.Timestamp timestamp2 = new Timestamp(2024, 7, 12, 0 , 0, 0, 0);

    System.out.println(date1.getTime());  // 61681536000000
    System.out.println(date1.getMonth()); // 7
    System.out.println(date1);            // Tue Aug 12 00:00:00 CST 3924

    System.out.println(date2.getTime());  // 61681536000000
    System.out.println(date2.getMonth()); // 7
    System.out.println(date2);            // 3924-08-12
}
@Test
public void testJSR310() {
    // month 1 to 12. day 1 to 31.
    java.time.LocalDate localDate = java.time.LocalDate.of(2024, 8, 12);
    // nanoOfSecond 0 to 999,999,999
    java.time.LocalTime localTime = java.time.LocalTime.of(0, 0, 0, 0);
    java.time.LocalDateTime localDateTime = java.time.LocalDateTime.of(2024, 8, 12,
            0, 0, 0, 0);

    java.time.ZoneId zoneId = ZoneId.systemDefault();
    // 解析一个符合 ISO 8601 标准的字符串表示的时间戳,注意这里的 Z 表示 UTC 时间
    // 它是1970-01-01 以来的偏移量,它包含秒和纳秒,携带时区
    java.time.Instant instant = java.time.Instant.parse("2024-08-12T00:00:00.000Z");
    // 携带时区
    java.time.ZonedDateTime zonedDateTime = ZonedDateTime.of(2024, 8, 12,
            0, 0, 0, 0, zoneId);

    System.out.println(localDate);     // 2024-08-12
    System.out.println(localTime);     // 00:00
    System.out.println(localDateTime); // 2024-08-12T00:00
    System.out.println(zoneId);        // Asia/Shanghai
    System.out.println(instant);       // 2024-08-12T00:00:00Z
    System.out.println(zonedDateTime); // 2024-08-12T00:00+08:00[Asia/Shanghai]
}
@Test
public void testMySQL() throws Exception {
    String url = "jdbc:mysql://172.17.0.2:3306/temp";
    String user = "root";
    String password = "123456";

    Connection connection = DriverManager.getConnection(url, user, password);

    Statement statement = connection.createStatement();
    ResultSet rs = statement.executeQuery("SELECT * FROM tbl");
    while (rs.next()) {
        // date         java.sql.Date 类型
        Object obj1 = rs.getObject(1);
        LocalDate r1 = rs.getObject(1, LocalDate.class);

        // time         java.sql.Time 类型
        Object obj2 = rs.getObject(2);
        LocalTime r2 = rs.getObject(2, LocalTime.class);

        // datetime     8.0.22 是 java.sql.Timestamp 类型  8.0.33 是 java.time.LocalDateTime 类型
        Object obj3 = rs.getObject(3);
        LocalDateTime r3 = rs.getObject(3, LocalDateTime.class);

        // timestamp    java.sql.Timestamp 类型
        Object obj4 = rs.getObject(4);
        LocalDateTime r4 = rs.getObject(4, LocalDateTime.class);
    }

    connection.close();
}

二、ISO 8601

1.ISO 8601 的基本格式

ISO 8601 规定了一种标准的日期和时间表示方式,以确保在全球范围内的一致性

  1. 日期格式:YYYY-MM-DD
  2. 时间格式:hh:mm:ss
  3. 日期和时间结合:YYYY-MM-DDThh:mm:ss

例如,2024年1月11日上午10点30分15秒的表示为:2024-01-11T10:30:15

2.时区表示

  1. 协调世界时(UTC):使用字母’Z’表示,例如:2024-01-11T10:30:15Z
  2. 时区偏移:使用+/-hh:mm的形式表示相对于UTC的偏移,例如:2024-01-11T10:30:15+03:00 表示相对于UTC的3小时偏移