useTimezone - это более раннее решение. Команда MySQL переписала код setTimestamp / getTimestamp довольно недавно, но она будет включена, только если вы установили параметр соединения useLegacyDatetimeCode = false, и вы используете последнюю версию соединителя JDBC mysql. Например:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Если вы загрузите исходный код mysql-коннектора и посмотрите на setTimestamp, очень легко увидеть, что происходит:
Если использовать устаревший код времени даты = false, newSetTimestampInternal (...). Затем, если Календарь, переданный в newSetTimestampInternal, равен NULL, ваш объект даты форматируется в часовом поясе базы данных:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Очень важно, чтобы Calendar был нулевым - поэтому убедитесь, что вы используете:
setTimestamp(int,Timestamp).
... NOT setTimestamp (int, Timestamp, Calendar).
Теперь должно быть очевидно, как это работает. Если вы построите дату: 5 января 2011 г. 3:00 в Америке / Los_Angeles (или любой другой часовой пояс, который вы хотите), используя java.util.Calendar и call setTimestamp (1, myDate), тогда он примет вашу дату, используйте SimpleDateFormat для его форматирования в часовом поясе базы данных. Итак, если ваша БД находится в Америке / New_York, она построит String '2011-01-05 6:00:00', чтобы вставить (поскольку NY опережает LA на 3 часа).
To получить дату, использовать getTimestamp (int) (без календаря).
Примечание: часовой пояс веб-сервера совершенно неактуален! Если вы не установили для useLegacyDatetimecode значение false, временной интервал веб-сервера используется для форматирования - добавление большого количества путаницы.
Примечание:
Возможно, MySQL мой жалуется, что серверный часовой пояс неоднозначен. Например, если ваша база данных настроена на использование EST, в Java может быть несколько возможных часовых поясов EST, поэтому вы можете пояснить это для mysql-коннектора, указав точно, что такое часовой пояс базы данных:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Вам нужно только сделать это, если он жалуется.
При создании HTTP-запроса добавьте Prefer: odata.include-annotations = "*" в свои заголовки HTTP-запроса. Таким образом, ответ будет иметь не только поле _ [Имя поля] _value с идентификатором, но также _ [Имя поля] _value@Microsoft.Dynamics.CRM.lookuplogicalname с логическое имя, которое вы ищете.
Это пример ответа на запрос, запрашивающий parentcustomerid определенного контакта без заголовка:
{
"@odata.context": "https://[Organization URI]/api/data/v9.0/$metadata#contacts(_parentcustomerid_value)",
"value": [
{
"_parentcustomerid_value": "bdeb86af-7e1c-e811-a837-000d3ac085f9",
"contactid": "b050f3bb-dbf7-e811-a98a-000d3ac02bae"
}
]
}
И это пример ответа для того же запрос с добавленным заголовком:
{
"@odata.context": "https://[Organization URI]/api/data/v9.0/$metadata#contacts(_parentcustomerid_value)",
"value": [
{
"_parentcustomerid_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "parentcustomerid_account",
"_parentcustomerid_value@Microsoft.Dynamics.CRM.lookuplogicalname": "account",
"_parentcustomerid_value": "bdeb86af-7e1c-e811-a837-000d3ac085f9",
"contactid": "b050f3bb-dbf7-e811-a98a-000d3ac02bae"
}
]
}