Я создаю приложение 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