Метод Java Date.toString() дает два разных результата на разных серверах Linux [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Метод Java Date.toString() дает два разных результата на разных серверах Linux [закрыто]

Сообщение Anonymous »

Мы получаем «org.postgresql.util.PSQLException: ERROR: неверный синтаксис ввода для метки времени типа: «Wed Jun 26 23:27:35 TRT 2024»» в качестве исключения, когда наше приложение пытается вставить заданную дату в столбец временной метки (PostgreSQL). Я предполагаю, что это из-за часового пояса TRT, а не EET. Это происходит только на одном из наших серверов Linux, а не на других, что указывает на то, что это проблема окружающей среды, но я не смог определить, что может быть ее причиной. Мы используем новую дату (System.currentTimeMillis()) для получения даты.
Я пробовал проверить часовой пояс серверов с помощью date и datectl, но они идентичны обоим они находятся в часовом поясе GMT+3. Я также создал небольшое приложение для проверки JVM и часового пояса пользователя. Вот код:

Код: Выделить всё

System.out.println("JVM Time Zone : " + java.util.TimeZone.getDefault().getID());
System.out.println("User Time Zone : " + System.getProperty("user.timezone"));
System.out.println("Milliseconds : " + System.currentTimeMillis());
Date date = new Date(System.currentTimeMillis());
System.out.println(date.toString());
Когда я запустил это приложение, оно дало одинаковый результат на обоих серверах (несмотря на разницу во времени в миллисекундах, которое мне требуется для запуска приложения). Я также использовал команду locale, чтобы проверить, есть ли какая-либо разница в локали серверов, но она была одинаковой. Еще я проверил версии Java, поскольку, по-видимому, часовой пояс меняется между Java 1.8 и Java 17 для Турции. В то время как 17 давало TRT, 1.8 давало EET в качестве часового пояса, когда я запускал его на своем локальном компьютере. Итак, я проверил версии Java между серверами, но они оказались одинаковыми. Я также проверил, передаются ли какие-либо параметры при запуске используемого нами сервера Jboss. Вот параметры, когда я смотрю на процессы:

Код: Выделить всё

java -D[Standalone] -server -XX:+UseCompressedOops -verbose:gc -Xloggc:/opt/jboss-eap-6.4/standalone1/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms2048m -Xmx2048m -XX:MaxPermSize=512m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djboss.modules.policy-permissions=true -Dorg.jboss.boot.log.file=/opt/jboss-eap-6.4/standalone1/log/server.log -Dlogging.configuration=file:/opt/jboss-eap-6.4/standalone1/configuration/logging.properties -jar /opt/jboss-eap-6.4/jboss-modules.jar -mp /opt/jboss-eap-6.4/modules -jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone -Djboss.home.dir=/opt/jboss-eap-6.4 -Djboss.server.base.dir=/opt/jboss-eap-6.4/standalone1 -Djboss.server.base.dir=/opt/jboss-eap-6.4/standalone1 -Djboss.bind.address= -Djboss.bind.address.management= --server-config=standalone.xml
Я проверил этот пост, но он отличается от этого вопроса, поскольку в этой проблеме он показывает тот же результат при использовании timedatectl. У нас есть несколько приложений, которые используют новую дату (System.currentTimeMillis()) для получения текущей даты, поэтому, если есть решение, не требующее ее изменения, я был бы признателен.
< strong>РЕДАКТИРОВАТЬ:
Вот код, который может воспроизвести проблему:

Код: Выделить всё

Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection(String.format("jdbc:postgresql://%s:%s/%s", "IP", "PORT", "DB"), "USER", "PW");
CallableStatement st = conn.prepareCall("CALL \"DB\".storedProcedure('param1', 'param2', 'param3', 'param4', 'param5', '" + new Date() + "', '" + new Date() +"')");
st.executeUpdate();
Я изменил имена параметров и хранимых процедур, поскольку они не имеют значения.
Вот запрос, который может создать таблицу и хранимую процедуру, используемые в коде:

Код: Выделить всё

CREATE TABLE "DB"."table" (
"id" bigserial NOT NULL,
"col1" varchar(150) NULL,
"col2" varchar(30) NULL,
"col3" varchar(15) NULL,
"col4" varchar(150) NULL,
"col5" varchar(15) NULL,
"start" timestamp NULL,
"end" timestamp NULL,
CONSTRAINT id_pk PRIMARY KEY ("id"));

CREATE OR REPLACE PROCEDURE "DB".storedprocedure(param1 character varying, param2 character varying, param3 character varying, param4 character varying, param5 character varying, starttime timestamp without time zone, endtime timestamp without time zone)
LANGUAGE plpgsql
AS $procedure$
BEGIN
INSERT INTO "DB"."table"("col1" , "col2", "col3", "col4", "col5", "start", "end")
VALUES (param1, param2, param3, param4, param5, startTime, endTime);
END;
$procedure$
;
а вот трассировка стека, которую я получаю при запуске этого приложения:

Код: Выделить всё

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: invalid input syntax for type timestamp: "Tue Jul 02 17:31:43 TRT 2024"
Position: 88
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2674)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2364)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:354)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:484)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:404)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:162)
at org.postgresql.jdbc.PgCallableStatement.executeWithFlags(PgCallableStatement.java:83)
at org.postgresql.jdbc.PgCallableStatement.executeUpdate(PgCallableStatement.java:66)
at mymain.main(mymain.java:27)
Я также хочу поделиться результатом timedatectl обоих серверов

Код: Выделить всё

      Local time: Tue 2024-07-02 17:42:08 +03
Universal time: Tue 2024-07-02 14:42:08 UTC
RTC time: Tue 2024-07-02 14:42:08
Time zone: Europe/Istanbul (+03, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a

Local time: Tue 2024-07-02 17:42:36 +03
Universal time: Tue 2024-07-02 14:42:36 UTC
RTC time: Tue 2024-07-02 14:42:36
Time zone: Europe/Istanbul (+03, +0300)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
И напоследок добавлю еще немного информации:
  • Оба сервера используют Java 1.8.0_302.
    На обоих серверах установлено одно и то же приложение.
  • Оба сервера имеют одинаковый часовой пояс и время.


Подробнее здесь: https://stackoverflow.com/questions/786 ... t-linux-se
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Метод Java Date.toString() дает два разных результата на разных серверах Linux.
    Anonymous » » в форуме Linux
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Сохранять информацию о часовом поясе из Date() при вызове Date().toString() в Javascript
    Anonymous » » в форуме Javascript
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Std :: norm дает два разных результата (один для RHEL8, а другой для Ubuntu22)
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Std :: norm дает два разных результата (один для RHEL8, а другой для Ubuntu22)
    Anonymous » » в форуме Linux
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Std :: norm дает два разных результата (один для RHEL8, а другой для Ubuntu22)
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»