Program Tip

Java에서 MySQL 날짜 및 타임 스탬프 처리

programtip 2020. 12. 15. 19:44
반응형

Java에서 MySQL 날짜 및 타임 스탬프 처리


자바 애플리케이션에서 날짜 시간과 타임 스탬프를 혼합하여 MySQL 데이터베이스로 날짜 정보를 추가하고 입력하는 측면에서 좋은 타협은 무엇입니까?


Java 측에서 날짜는 일반적으로 (잘못 설계되었지만 옆에 있음)로 표시 java.util.Date됩니다. 기본적으로 타임 스탬프라고도 하는 a 풍미의 Epoch 시간기반으로합니다 long. 날짜 및 시간 부분에 대한 정보가 모두 포함되어 있습니다. Java에서 정밀도는 밀리 초 단위입니다.

SQL 측면에서, 거기에 몇 가지 표준 날짜와 시간 유형이다 DATE, TIME그리고 TIMESTAMP(일부 DB도라고에 DATETIME), JDBC의로 표현되는 java.sql.Date, java.sql.Timejava.sql.Timestamp모든 서브 클래스 의이 java.util.Date. 정밀도는 종종 Java와 같이 밀리 초 단위로 DB에 따라 다르지만 초 단위 일 수도 있습니다.

반대로에서 java.util.Date의이 java.sql.Date날짜 부분 (년, 월, 일)에 대한 정보 만 포함되어 있습니다. (가) Time시간 부분에 대한 정보 만 (시간, 분, 초)를 포함하고,이 Timestamp는 두 부분에 대한 정보를 포함로 같은 java.util.Date않습니다.

타임 스탬프를 DB에 저장하는 일반적인 관행 (즉, java.util.DateJava 측 및 java.sql.TimestampJDBC 측)은 PreparedStatement#setTimestamp().

java.util.Date date = getItSomehow();
Timestamp timestamp = new Timestamp(date.getTime());
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?");
preparedStatement.setTimestamp(1, timestamp);

DB에서 타임 스탬프를 얻는 일반적인 방법은 ResultSet#getTimestamp().

Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.

MySQL 문서 에는 MySQL 유형을 Java 유형에 매핑하는 방법에 대한 정보가 있습니다. 일반적으로 MySQL 날짜 시간 및 타임 스탬프의 경우 java.sql.Timestamp. 몇 가지 리소스는 다음과 같습니다.

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

Java Date를 Mysql datetime에 저장하는 방법 ...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

편집하다:

다른 사람들이 지적했듯이 문자열 사용 제안으로 인해 문제가 발생할 수 있습니다.


BalusC는 문제에 대한 좋은 설명을 제공했지만 사용자가 직접 선택하고 테스트 할 수있는 엔드 투 엔드 코드가 부족합니다.

모범 사례는 항상 날짜-시간을 UTC 시간대로 DB에 저장하는 것입니다. SQL 타임 스탬프 유형에 시간대 정보가 없습니다.

날짜 시간 값을 SQL DB에 쓸 때

    //Convert the time into UTC and build Timestamp object.
    Timestamp ts = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
    //use setTimestamp on preparedstatement
    preparedStatement.setTimestamp(1, ts);

DB에서 Java로 값을 다시 읽을 때,

  1. java.sql.Timestamp 유형 그대로 읽으십시오.
  2. LocalDateTime 클래스의 atZone 메서드를 사용하여 DateTime 값을 UTC 시간대의 시간으로 장식합니다.
  3. 그런 다음 원하는 시간대로 변경하십시오. 여기에서는 토론토 시간대로 변경합니다.

    ResultSet resultSet = preparedStatement.executeQuery();
    resultSet.next();
    Timestamp timestamp = resultSet.getTimestamp(1);
    ZonedDateTime timeInUTC = timestamp.toLocalDateTime().atZone(ZoneId.of("UTC"));
    LocalDateTime timeInToronto = LocalDateTime.ofInstant(timeInUTC.toInstant(), ZoneId.of("America/Toronto"));
    

참조 URL : https://stackoverflow.com/questions/3323618/handling-mysql-datetimes-and-timestamps-in-java

반응형