Как преобразовать время в UT C перед отправкой на сервер в Ruby в приложении Rails, используя jQuery Datepicker - PullRequest
1 голос
/ 01 апреля 2020

Я недавно принял полностью функционирующий проект, написанный на Ruby на Rails. Сообщалось об ошибке, которую я пытаюсь решить, но не добился большого успеха.

Это код CoffeeScript, который вызывается в коде Haml:

$('#report-datetime-picker').daterangepicker({
    timePicker: true,
    timePicker12Hour: false,
    timePickerIncrement: 5,
    format: 'YYYY-MM-DD HH:mm'
  }, (start, end) ->
    # assign human readable string to input box
    # unix times are the real values sent to server.  datetime-text-field is just user frontend
    $('#datetime-start').val(start.unix())
    $('#datetime-end').val(end.unix())
    $('#datetime-text-field').val(start.format('YYYY-MM-DD HH:mm') + " - " + end.format('YYYY-MM-DD HH:mm'))
  )

и:

                %label#datetime-label{ for: 'datetime-text-field' } Date/Time Range
                .form-group
                    .input-group.date#report-datetime-picker
                        %span.input-group-addon.add-on
                            %i.fa.fa-calendar

                        %input.form-control#datetime-text-field{ type: 'text', value: @time_format }

                %input#datetime-start{ hidden: true, name: 'startTime', text: 'text', value: (@start_time.to_i rescue nil) }
                %input#datetime-end{ hidden: true, name: 'endTime', text: 'text', value: (@end_time.to_i rescue nil) }

                %button.btn{ type: 'submit' } Submit

Проблема в том, что когда пользователь выбирает диапазон дат, он конвертируется в его эквивалент UT C относительно текущего системного времени пользователя.

Например, если пользователь в восточном часовом поясе хочет получить ежемесячный отчет и, таким образом, выбирает «4/1/2020 0:00 - 30/30/2020 23:59», он вместо этого отправляет сервер 4/1/2020 04:00 - 5/1/2020 03:59, из-за которого ежемесячный отчет пропускает первые четыре часа активности и неверно включает первые четыре часа активности следующего месяца. Отношения месяца не могут использоваться, поскольку диапазоны времени не обязательно являются ежемесячным отчетом, хотя это наиболее распространенный вариант использования.

Я проверил application.rb и config.time_zone = 'UTC'. Я также просмотрел оставшуюся часть кода, и все ссылки на часовые пояса указаны в UT C.

. Я также подтвердил, что если пользователь в восточном часовом поясе выберет «1/1/2020 00:00» в дате сборщик, время, которое фактически сохраняется во время запуска, равно 4/1/2020 04:00, а не 4/1/2020 00:00.

1 Ответ

0 голосов
/ 08 апреля 2020

Поскольку запрос работает нормально, но отображает его некорректно, попробуйте преобразовать обычный объект даты JS вместо метода .unix(), а затем преобразовать в UT C на сервере

$('#datetime-start').val(start.toDate())
$('#datetime-end').val(end.toDate())

Когда форма отправлена ​​и значения отправлены на сервер, они должны содержать информацию о часовом поясе (например, Wednesday, April 8, 2020 11:11:50 AM GMT+01:00 DST)

Если вы проанализируете это в серверной части объекта даты, вы сможете преобразовать ее в Time объект с Time.parse и используйте .utc() для преобразования его из заданного часового пояса в UT C.

...