@rd-r

Работа с временными зонами в Ruby on Rails?

Заранее благодарен всем кто ответит.
У меня следующая ситуация. Клиентская сторона отправляет EXIF данные фотографии на сервер. Причем любая дата ( originalDateTime, dateTime или digitizedDateTime) отправляется в формате rfc3339 с обнуленным смещением (например:2017-20-10T12:50:30+00:00, почему именно так а не иначе, другой вопрос. Изменить сейчас я это не смогу). На серверной стороне происходит ПРИМЕРНО следующее. Вычисляем timeZone на основе координат, создаем объект даты-времени с нужным смещением, затем приводим эту дату к определенному по умолчанию на сервере часовому поясу (Central Daylight Time) и сохраняем потом в БД. Я не могу изменить сейчас то, в каком формате мы получаем дату, и в каком сохраняем в БД. Далее из БД, эта дата вынимается, конвертируется снова в формат rfc3339, и отправляет клиентской стороне.
Я думаю, здесь точно есть какая-то ошибка, с конвертированием даты и времени, которую я сейчас не могу увидеть.
Вопрос: Есть ли во всех этих действиях что-то вообще валидное?

if picture[:picture_timestamp]

                if picture[:latitude] && picture[:longitude]

                  parsed_date_time = DateTime.rfc3339(picture[:picture_timestamp]).to_s(:db)
                  timezone = Timezone.lookup(picture[:latitude], picture[:longitude])
                  date_obj = ActiveSupport::TimeZone[timezone.name].parse(parsed_date_time)

                  date_with_offset = DateTime.new(date_obj.year, date_obj.month, date_obj.day, date_obj.hour, date_obj.min, date_obj.sec, date_obj.zone).to_s

                  @dailypost.picture_timestamp = Time.zone.parse(date_with_offset)
                end
 end
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
Причем любая дата ( originalDateTime, dateTime или digitizedDateTime) отправляется в формате rfc3339 с обнуленным смещением
Потому что UTC.
Смещение временной зоны можно вычислить по местонахождению при помощи гема timezone.
Соответственно, в БД нужно для каждого изображения хранить время в колонке datetime, а не varchar , чтобы избегать лишних парсинга и форматирования дат.
Если клиенту нужно отдать время в формате rfc3339, то форматировать непосредственно при формировании ответа HTTP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы