Javaプロジェクト時間とサーバ時間が同期していない問題の解決
問題の説明 Jarパッケージでサーバで直接実行するSpringBootプロジェクトで取得したタイムスタンプは、現在の時間より12時間1遅く、システム時間に問題はありません. dockerミラーで実行するSpringBootプロジェクトが取得するタイムスタンプは、現在の時間より8時間遅く、この問題は、問題1を解決したサーバ上の に発生します.
問題1
データベースのタイムゾーンとデータベースの接続構成の表示
sqlを使用してデータベースの現在時刻
サーバシステム時間の表示
サーバーのハードウェア時間の表示
プロジェクトログを見ると、プロジェクトログの時間も間違っていて、現在の時間より12時間遅いことがわかります.
インターネットを通じて資料を調べて、位置付けはJVMの問題です
まず見つけた方法はjarパケットを起動するコマンドにタイムゾーンパラメータ
問題2
ローカルテストでは、データベースに挿入されたデータタイムスタンプに問題がないことがわかりました.問題1のチェックがあったので、直接プロジェクトログを見てみると、時間が確かに間違っていましたが、状況は違います.このプロジェクトは問題1が発生したプロジェクトと同じサーバーにあるので、dockerミラーで実行されています.
他のネット上で言うホスト時間を同期する方法はすべて試したことがあって、私のこのような情況に対して適用しません
最後に、docker起動時にパラメータを追加してタイムゾーンを指定すればいいというネットユーザーのアドバイスを採用しました.-d-e TZ=「Asia/shanghai」-v/etc/localtime:/etc/localtime:ro如:
参考記事:https://blog.csdn.net/fullbug/article/details/78619701
問題1
データベースのタイムゾーンとデータベースの接続構成の表示
sqlを使用してデータベースの現在時刻
select now();
をクエリーすると、現在時刻であることがわかります.問題がなく、データベース接続プロパティを表示しますか?useUnicode=true&characterEncoding=UTF-8*&serverTimezone=UTC**タイムゾーン設定サーバシステム時間の表示
date
コマンドを使用して、表示時間:2019年10月11日金曜日10:12:22 CST使用date -R
表示時間タイムリーエリア:Fri,11 Oct 2019 10:14:22+0800サーバーのハードウェア時間の表示
sudo hwclock --show
を使用してサーバーのハードウェア時間を表示します.2019-10-11 10:16:36.554545+0800プロジェクトログを見ると、プロジェクトログの時間も間違っていて、現在の時間より12時間遅いことがわかります.
インターネットを通じて資料を調べて、位置付けはJVMの問題です
まず見つけた方法はjarパケットを起動するコマンドにタイムゾーンパラメータ
java -jar -Duser.timezone=GMT+08 xxx.jar
を追加することですが、これは一時的な解決策で、起動するたびにタイムゾーンパラメータを追加する必要があり、面倒なので、次のような一労永逸な方法を探しました.実際に実行する場合、これらのコマンドは管理者権限を使用して実行する必要があります.前にsudoを追加すればいいです.1.編集時間プロファイルsudo vim /etc/sysconfig/clock
ZONE=「Asia/shanghai」UTC=false#をfalseに設定します.ハードウェアクロックがutc時間に一致しないARC=false 2.linuxのタイムゾーンは上海タイムゾーンsudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3.アライメント時間sudo ntpdate cn.pool.ntp.org
4.ハードウェア時間とシステム時間が一致し、sudo /sbin/hwclock --systohc
をキャリブレーションして正常にプロジェクトを再起動すればよい問題2
ローカルテストでは、データベースに挿入されたデータタイムスタンプに問題がないことがわかりました.問題1のチェックがあったので、直接プロジェクトログを見てみると、時間が確かに間違っていましたが、状況は違います.このプロジェクトは問題1が発生したプロジェクトと同じサーバーにあるので、dockerミラーで実行されています.
他のネット上で言うホスト時間を同期する方法はすべて試したことがあって、私のこのような情況に対して適用しません
最後に、docker起動時にパラメータを追加してタイムゾーンを指定すればいいというネットユーザーのアドバイスを採用しました.-d-e TZ=「Asia/shanghai」-v/etc/localtime:/etc/localtime:ro如:
docker run -d -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -e PARAMS="spring.profiles.active=test" --name commonSecurity -p 9000:8080 -v /home/dataexa/insight-microservice/commonSecurity:/usr/local/tomcat/webapps/ROOT -d tomcat
ステップ1:docker ps
実行中のdockerミラーを表示するステップ2:ミラーを閉じるまたは削除ミラーを閉じるdocker stop id
ミラーを削除するステップdocker rm -f
ミラーを削除するステップ3:名前を使用してミラーをパブリッシュし、プロジェクトwarパッケージの解凍後のWEB-INF下のclassesディレクトリの下でプロジェクト起動コマンドdocker run -d -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -e PARAMS="spring.profiles.active=test" --name commonSecurity -p 9000:8080 -v /home/dataexa/insight-microservice/commonSecurity:/usr/local/tomcat/webapps/ROOT -d tomcat
を実行する参考記事:https://blog.csdn.net/fullbug/article/details/78619701