Trakt API использует разное время для отслеживаемого статуса (на час вперед) - PullRequest
0 голосов
/ 16 октября 2019

Я создаю приложение Android для управления учетной записью Trakt с помощью Trakt API.

Я использую библиотеку Retrofit для доступа к этому API.

У меня проблема с добавлением Traktна час впереди значения, которое я передаю.

Например, я передаю метку времени UTC: 2019-10-16T19: 54Z

Я ожидаю время 19:54. Тракт вместо этого добавит час, делая это 20:54. Я использую библиотеку org.threeten.bp OffSetDateTime.

Я установил перехватчик класса OkHttp, чтобы проверить полезную нагрузку JSON, передаваемую в Trakt API. Я передаю правильную метку времени (watched_at): D / OkHttp: {"movies": [{"ids": {"trakt": 265470}, "watched_at": "2019-10-16T19: 54Z"}]}

У меня есть метод (ниже), который сначала отображает DatePickerDialog, а затем отображает TimePickerDialog для захвата выбранного пользователем даты / времени.

Эти данные затем используются для создания объекта LocalDateTime, который затем используется для построенияOffsetDateTime для метки времени UTC.

Это значение передается в Trakt API: https://trakt.docs.apiary.io/#reference/sync/add-to-history

Код:

        var datePickerFragment =
            DatePickerFragment(DatePickerDialog.OnDateSetListener { datePicker, year, month, day ->

                var timePickerFragment =
                    TimePickerFragment(TimePickerDialog.OnTimeSetListener { timePicker, hourOfDay, minutes ->

                        // Make a LocalDateTime object based on values passed from Android DatePickerDialog and TimePickerDialog
                        var time = LocalDateTime.of(year, month+1, day, hourOfDay, minutes, 0, 0)

                        // Trakt API requires UTC datetime stamp
                        // https://trakt.docs.apiary.io/#reference/sync/add-to-history
                        var date = OffsetDateTime.of(time, ZoneOffset.UTC)

                        // Create a new SyncMovie instance
                        var syncMovie = SyncMovie().id(MovieIds.trakt(movie!!.ids.trakt))

                        // Set the watched date
                        syncMovie.watched_at = date

                        var checkInRequest = traktApi.sync().addItemsToWatchedHistory(SyncItems().movies(syncMovie))

                        checkInRequest.enqueue(object: Callback<SyncResponse> {
                            override fun onFailure(call: Call<SyncResponse>, t: Throwable) {
                                Log.e(TAG, "Failed to checking movie ${movie!!.title}")
                                Log.e(TAG, t.message)
                                activity?.runOnUiThread {
                                    Toast.makeText(context, "Failed to checkin movie ${movie!!.title}", Toast.LENGTH_LONG).show()
                                }
                            }

                            override fun onResponse(call: Call<SyncResponse>, response: Response<SyncResponse>) {
                                activity?.runOnUiThread {
                                    Toast.makeText(context, "Successful checking for movie ${movie!!.title}! You wanted on ${date.format(
                                        DateTimeFormatter.ofPattern("dd/MM/YYYY hh:mm"))}", Toast.LENGTH_LONG).show()
                                }
                            }
                        })


                    })

                timePickerFragment.show(fragmentManager!!, "Time Picker")
            })

        datePickerFragment.show(fragmentManager!!, "Date Picker")

Я предполагаю, что здесь что-то упущено. Я написал простую Java-программу для проверки результатов использования вышеупомянутого (библиотеки Java.time *, а не org.threeten *) и не смог воспроизвести проблему:

LocalDateTime date = LocalDateTime.of(2019, 10, 16, 18, 35, 0);

OffsetDateTime offsetTime = OffsetDateTime.of(date, ZoneOffset.UTC);

       System.out.println("Time before offset "+date.toString());
       System.out.println("Time post offset "+offsetTime.toString());

       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH::mm");

       System.out.println("Time formatted before offset - "+date.format(formatter));
       System.out.println("Time formatted post offset - "+offsetTime.format(formatter));

Результат выше:

Time before offset 2019-10-16T18:35
Time post offset 2019-10-16T18:35Z
Time formatted before offset - 16/10/2019 18::35
Time formatted post offset - 16/10/2019 18::35

1 Ответ

0 голосов
/ 19 октября 2019

Я решил, что лучший подход к решению этой проблемы - просто отвести один час от времени, вводимого пользователем, поскольку Trakt все равно добавит еще один час:


var time = LocalDateTime.of(year, month+1, day, hourOfDay, minutes, 0, 0)

// Trakt time hack, Trakt will automatically add +1 hour for all history syncs, so take one hour to off set this
var timeHack = time.minusHours(1)
var date = OffsetDateTime.of(timeHack, ZoneOffset.UTC)

Я до сих пор не понимаю, почему Traktдобавляет один час к предоставленному времени.

...