TimestampとDatetime
TimestampとDateTimeホットスポット
Timestamp
とDatetime
の最大の違いは、timezone
の情報がユニークであることである.我々のグループが実装するAPIサーバロジックは、
Java
コードからLocalDateTime.now()
を呼び出し、APIサーバコンピュータのtimezone
時間情報を利用してLocalDataTimeオブジェクトを生成し、timestamp
タイプのcreated_at
列にデータを入れることによって実現される.AWS上でAPIサーバを配備してテストした後、Createat上の予想値とは異なる問題が発生しました.つまり、データは-9時間処理されます.
これは、AWSで作成されたインスタンスのデフォルトの
timezone
環境変数がUTC
に設定されているためです.ubuntu
のtimezone
設定を様々な方法で変更し、terminal
ウィンドウにdate
コマンドを入力し、KST
に変更されたことを確認し、試行を続けたが、困難に直面した.通常時間終了後にテストを行ったところ、
timezone
変数を修正する操作はUbuntu OSに表示されている設定にのみ触れており、実際に使用されているjava
コードのシステム環境変数は変更されていないことがわかり、これは問題のようです.Java
コードにおいて、LocalDateTime
は、対応する実行環境コンピュータのtimezone
設定に従い、timezone
設定をKST
に変更したが、Java
に見られるtimezone
設定はUTC
のままであるため、Java
セグメントにおいて誤った時間でクエリ文が生成される.##テストプロセス...
まず,テスト用
java
コードを記述し,ubuntuサーバのtimezone
環境変数をテストした.1.tzselect設定方法
$ sudo tzselect
Asia/Seoul
に変更しても、java
に見えるtimezone
がUTC
であることが確認できます.しかし、
date
コマンドを入力すると?今は
KST
時間です.そのため,環境変数が正しく変更され,困難に直面していると勘違いされている.2.ln-sf/usr/share/zoneinfo/ASIA/Seoul/etc/localtimeの設定方法
$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
同様に、
java
はUTC
とされている.3.timedatectl set-timezone「Asia/seoul」の設定方法
$ sudo timedatectl set-timezone 'Asia/Seoul'
困難な部分
先日
Timestamp
とDatetime
の違いを学習した場合、最大の違いはtimezone
の反映の有無である.timestamp
は、格納されているデータ自体にtimezone
の情報が含まれていると考え、テストを行ったところ不適切な点が多すぎることに気づき、しばらくうろうろしていました.これは間違った考えです.DBは、
timestamp
型のカラムデータを単純に格納する場合にのみ、クエリ入力の文字列値をUTC
形式に変換して格納し、検索時に格納したUTC
形式のデータを呼び出しポイントのDB timezone
時間に戻す.そのため、1枚の表に世界中の人の投稿データと記入時間を保存し、国ごとに適切な時間で表示することは不可能で、
timestamp
列しかありません.たとえば、タイムスタンプによって作成されたサービスを適用できます。
データベースは1つ、
timezone
はUTC
に設定されています.テーブルを国ごとに分けて、
한국에서 쓴 글을 모아둔 테이블
미국에서 쓴 글을 모아둔 테이블
...それぞれの国が文章を書く時間を貯める.timezone
が個別に設定されている場合、テーブルに格納されている書き込み時間は国によって提供されます.最終的には、クエリ文を渡して
timestamp
列にデータを入れる場合、'2022-04-12 22:15:00'
列に時間を入れるか、クエリ文でnow()を呼び出し、データベース・サーバ自体が設定したtimezone
を使用して時間を追加するかに注意する必要があります.前者については、
java
段において各国timezone
に該当する現在時刻を生成してクエリ文に入れるだけで、きれいに処理することができる.後者の場合、now()を使用する場合は、データベース・サーバの
timezone
の設定に注意し、クエリ文に入る時間誤差が時差に合致するように処理を追加する必要があります.下の形のようです.insert into task (..., created_at) values (... ,CONVERT_TZ(now(),'+00:00','+09:00'));
最終的には、グローバルに提供する必要があるサービスを作成する際にtimestamp
形式を採用する場合、한국에 사는 A
と일본에 사는 B
が同時に文章を書くと、미국에 사는 C
が2つの文章を読んでも1분 전 작성된 글 입니다.
と簡単に表記することができます.関連項目:
Reference
この問題について(TimestampとDatetime), 我々は、より多くの情報をここで見つけました https://velog.io/@kyu/Timestamp-와-Datetimeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol