Trakt API 使用不同的时间作为监视状态(提前一小时)



我正在创建一个Android应用程序来使用Trakt API管理Trakt帐户。

我正在使用改造库来访问此 API。

我有一个问题,Trakt 在我传递的值之前一小时添加。

例如,我传递的 UTC 时间戳为: 2019-10-16T19:54Z

我预计时间是19:54。Trakt 将增加一个小时,使其为 20:54。 我正在使用org.threeten.bp OffSetDateTime库。

我设置了 OkHttp 类拦截器来检查传递给 Trakt API 的 JSON 有效负载。我正在传递正确的时间戳 (watched_at(: D/OkHttp: {"movies":[{"ids":{"trakt":265470},"watched_at":"2019-10-16T19:54Z"}]}

我有一个方法(如下(,它将首先显示一个 DatePickerDialog,然后显示 TimePickerDialog 以捕获所选的日期/时间用户。

然后,此数据用于创建 LocalDateTime 对象,该对象随后用于为 UTC 时间戳构建 OffsetDateTime。

此值将传递给 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

我决定解决这个问题的最佳方法是减少用户输入的时间一小时,因为无论如何 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 在提供的时间上增加了一个小时......

最新更新