Настройка Redmine 5.0 для UTC формата дат в API
Как настроить Redmine 5.0 для возврата дат в формате UTC без смещения часового пояса в REST API. Решение через конфигурацию Rails для совместимости с интеграциями.
Как настроить Redmine 5.0 для возврата дат в формате без смещения часового пояса в REST API?
После обновления Redmine с версии 3.4 до 5.0, REST API (/projects/project_identifier.json) изменил формат возвращаемых дат. Ранее дата возвращалась в формате:
“created_on”:“2012-09-15T08:54:45Z”
Теперь в Redmine 5.0 API возвращает дату со смещением часового пояса:
“created_on”:“2012-09-15T08:54:45+03:00”
Подскажите, пожалуйста, существует ли возможность настроить Redmine 5.0 так, чтобы REST API возвращал даты в прежнем формате без смещения часового пояса? Ищу решение через настройки самого Redmine, так как не хочется вносить изменения в существующий интеграционный инструмент.
В Redmine 5.0 можно настроить возвращение дат в формате без смещения часового пояса через конфигурацию Rails в файле config/application.rb. Настройте параметры config.active_record.default_timezone = :utc и config.time_zone = 'UTC', чтобы API всегда возвращал даты в формате с суффиксом ‘Z’ вместо смещения часового пояса.
Содержание
- Понимание изменения формата дат
- Конфигурация часового пояса в Redmine
- Пошаговая настройка для Redmine 5.0
- Альтернативные решения
- Проверка результатов
- Рекомендации по поддержке
Понимание изменения формата дат
После обновления Redmine с версии 3.4 до 5.0 формат дат в REST API действительно изменился. Это связано с обновлением Rails и изменением правил форматирования временных меток:
- Старый формат (Redmine 3.4):
"created_on":"2012-09-15T08:54:45Z" - Новый формат (Redmine 5.0):
"created_on":"2012-09-15T08:54:45+03:00"
Как указано в исследовании форматов дат, это изменение произошло из-за обновления Rails, который теперь использует разные правила форматирования временных меток. Формат с ‘Z’ указывает на время в UTC, тогда как формат со смещением (+03:00) показывает местное время сервера с учетом часового пояса.
Важно: Redmine по умолчанию не хранит временные метки в UTC, что создает проблемы при смене часового пояса сервера. Как отмечено в обсуждении обновления часового пояса сервера, это приводит к смещению всех временных меток на разницу между старым и новым часовым поясом.
Конфигурация часового пояса в Redmine
Redmine, будучи основанным на Rails, предоставляет несколько способов настройки формата дат и часовых поясов:
Основные параметры конфигурации
В файле config/application.rb доступны следующие параметры:
# Установка часового пояса по умолчанию для приложения
config.time_zone = 'UTC'
# Настройка формата хранения временных меток в базе данных
config.active_record.default_timezone = :utc
Как объясняется в документации по конфигурации часового пояса, эти параметры влияют на то, как Redmine обрабатывает и отображает временные метки.
Влияние на REST API
Параметр config.active_record.default_timezone особенно важен для REST API, так как он определяет, в каком формате временные метки будут возвращены в JSON/XML ответах:
:utc- временные метки возвращаются в формате UTC (с суффиксом ‘Z’):local- временные метки возвращаются в локальном времени сервера (со смещением часового пояса)
Пошаговая настройка для Redmine 5.0
Чтобы вернуть формат дат в прежний вид (без смещения часового пояса), выполните следующие шаги:
Шаг 1: Резервное копирование конфигурации
Перед изменением конфигурации создайте резервную копию файла:
cp /path/to/redmine/config/application.rb /path/to/redmine/config/application.rb.backup
Шаг 2: Редактирование файла конфигурации
Откройте файл config/application.rb и добавьте/измените следующие строки:
module RedmineApp
class Application < Rails::Application
# ... существующие настройки ...
# Установка часового пояса UTC для всех пользователей
config.time_zone = 'UTC'
# Хранение временных меток в UTC формате
config.active_record.default_timezone = :utc
# ... другие настройки ...
end
end
Шаг 3: Перезапуск службы Redmine
После изменения конфигурации перезапустите Redmine для применения настроек:
# Для систем с systemd
sudo systemctl restart redmine
# Для систем с Apache/Passenger
sudo touch /path/to/redmine/tmp/restart.txt
Шаг 4: Проверка результатов
Проверьте REST API запросом:
curl -H "X-Redmine-API-Key: YOUR_API_KEY" \
"http://your-redmine-url/projects/test-project.json"
Ожидаемый результат должен показывать даты в формате:
{
"project": {
"created_on": "2012-09-15T08:54:45Z",
"updated_on": "2024-01-15T10:30:00Z"
}
}
Альтернативные решения
Если изменение глобальной конфигурации не подходит, рассмотрите альтернативные варианты:
1. Настройка часового пояса для конкретных пользователей
Как упоминается в задаче #16484, можно установить часовой пояс по умолчанию для новых пользователей:
- Перейдите в “Администрирование” → “Настройки” → “Аутентификация”
- В разделе “Значения по умолчанию для новых пользователей” установите часовой пояс “UTC”
2. Использование промежуточного обработчика API
Если вы не хотите изменять основную конфигурацию, можно создать промежуточное ПО для обработки ответов API:
# config/initializers/api_timezone_fix.rb
class ApiTimezoneFix
def initialize(app)
@app = app
end
def call(env)
status, headers, response = @app.call(env)
if env['PATH_INFO'] =~ %r{/\.json}
# Обработка JSON ответов для удаления смещения часового пояса
modified_response = response.map do |body|
body.gsub(/(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})[+-]\d{2}:\d{2}/, '\1Z')
end
response = modified_response
end
[status, headers, response]
end
end
3. Обработка на стороне клиента
Если изменения на сервере невозможны, обновите интеграционный инструмент для обработки обоих форматов дат:
# Пример обработки в Python
import re
from datetime import datetime
def parse_redmine_date(date_str):
# Оба формата: "2012-09-15T08:54:45Z" и "2012-09-15T08:54:45+03:00"
if date_str.endswith('Z'):
return datetime.fromisoformat(date_str.replace('Z', '+00:00'))
else:
return datetime.fromisoformat(date_str)
Проверка результатов
После применения настроек убедитесь, что изменения работают корректно:
1. Тестирование через curl
# Проверка проектов
curl -s "http://redmine/projects.json" | jq '.projects[0].created_on'
# Проверка задач
curl -s "http://redmine/issues.json" | jq '.issues[0].created_on'
2. Проверка через веб-интерфейс
Убедитесь, что:
- Даты в веб-интерфейсе отображаются корректно
- Активность пользователя показывает правильное время
- Отчеты используют правильные временные метки
3. Логирование ошибок
Проверьте логи Redmine на предмет ошибок после изменений:
tail -f /path/to/redmine/log/production.log
Рекомендации по поддержке
Регулярная проверка конфигурации
Периодически проверяйте актуальность настроек часового пояса, особенно после обновлений Redmine:
grep -n "config.time_zone\|config.active_record.default_timezone" /path/to/redmine/config/application.rb
Документирование изменений
Внесите изменения в документацию вашего интеграционного инструмента, указав поддерживаемые форматы дат:
# Поддерживаемые форматы дат из Redmine API:
# - Стандартный: "2012-09-15T08:54:45Z" (UTC)
# - Альтернативный: "2012-09-15T08:54:45+03:00" (смещение)
Мониторинг интеграций
Настройте мониторинг интеграционных инструментов для обнаружения проблем с форматами дат:
# Пример мониторинга
def check_api_date_format():
response = requests.get("http://redmine/projects.json")
if "T" in response.text and ("+" in response.text or "Z" in response.text):
return True
return False
Заключение
Настройка Redmine 5.0 для возврата дат в формате без смещения часового пояса требует изменения конфигурации Rails. Основные решения включают:
- Глобальная конфигурация через
config/application.rbс установкойconfig.active_record.default_timezone = :utc - Настройка часового пояса UTC для всех пользователей через интерфейс администратора
- Обработка на стороне клиента для поддержки обоих форматов дат
После применения изменений обязательно протестируйте работу REST API и проверьте, что все интеграционные инструменты продолжают корректно обрабатывать даты. Регулярно обновляйте документацию и настройки после обновлений Redmine для поддержания совместимости.