クイックスタートとAPI リファレンスを使用して、Google Tasks アプリのプロトタイプを作成しています。タスクの取得に問題はありません。問題は、期日がどのタイムゾーンに保存されているかです。ドキュメントごとに期日を DateTime として取得し、デフォルト (ローカル) タイムゾーンで表示される値に変換します。
これが私が観察したことです:「10月4日水曜日」(Googleカレンダーでタスクを10月4日に移動した場合に得られるもの)などの期日は、UTCで「10月4日水曜日12:00am」として取得されます。これをローカル タイムゾーン (PDT) に変換すると、「Tue, Oct 3 5:00pm」と表示されます。
これは、Google タスクがすべてのタスクの日付と時刻を UTC で保存し、それらをローカル タイムゾーンの日付と時刻として解釈するように思わせます (つまり、私がニューヨークにいた場合でも、10 月 4 日水曜日の午前 12:00 を保存します)。これは、タイムゾーンを変更しても、Google カレンダー インターフェイスでタスクの期日が変更されないという私の見解と一致しています。
誰でも肯定または否定できますか?
これが私のコード スニペットです。基本的にはクイックスタートに従っています。取得しています...
private List<Task> getTasks() throws IOException {
List<Task> tasks =
mService.tasks()
.list("@default")
.setFields("items/id,items/title,items/notes,items/status,items/due,items/completed")
.execute()
.getItems();
return tasks;
}
表示する日時の計算:
final boolean isCompleted = "completed".equals(task.getStatus());
viewHolder.mCompleteCheckbox.setChecked(isCompleted);
viewHolder.mTitle.setText(task.getTitle());
if ((task.getNotes() == null) || task.getNotes().isEmpty()) {
viewHolder.mNotes.setVisibility(GONE);
} else {
viewHolder.mNotes.setVisibility(View.VISIBLE);
viewHolder.mNotes.setText(task.getNotes());
}
final DateTime dueOrCompletedDate = isCompleted ? task.getCompleted() : task.getDue();
if (dueOrCompletedDate == null ) {
viewHolder.mDueOrCompleted.setVisibility(GONE);
} else {
viewHolder.mDueOrCompleted.setVisibility(View.VISIBLE);
final String dateTimeString = Utils.timeMillisToDefaultShortDateTime(dueOrCompletedDate.getValue());
viewHolder.mDueOrCompleted.setText(dateTimeString);
}
そして、正しい日付を取得するためにUTCに変換している日時変換自体:
public static String dateFormat = "EEE, MMM d";
public static String timeMillisToDefaultShortTime(final long timeMillis) {
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedTime = df.format(timeMillis);
//TODO: Bit of a hack; Parse out p.m. and PM to hh:mmpm (to save space)
return formattedTime.replace("p.m.","pm").replace("P.M.","pm").replace("PM","pm").replace(" pm","pm")
.replace("a.m.","am").replace("A.M.","am").replace("AM","am").replace(" am","am");
}
public static String timeMillisToDefaultShortDateTime(final long timeMillis) {
String defaultShortTime = timeMillisToDefaultShortTime(timeMillis);
if (defaultShortTime.equals("12:00am")) defaultShortTime = "";
return timeMillisToDateFormat(timeMillis, dateFormat).concat(" ").concat(defaultShortTime);
}
private static String timeMillisToDateFormat(long milliSeconds, String dateFormat)
{
// Create a DateFormatter object for displaying date in specified format.
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
//FIXME: Convert to UTC
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
// Create a calendar object that will convert the date and time value in milliseconds to date.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
return formatter.format(calendar.getTime());
}
更新: 10 月 3 日にスケジュールされたタスクのデバッグ ビューは、Google タスクが UTC を使用している明確な証拠です。
o2 = {Task@5424} size = 4
0 = {DataMap$Entry@5501} "due" -> "2017-10-03T00:00:00.000Z"
1 = {DataMap$Entry@5502} "id" -> "MDg1MjU5NjA3OTE3MzY1OTM2MjM6MDoxNzAwMTU3NzM"
2 = {DataMap$Entry@5503} "status" -> "needsAction"
3 = {DataMap$Entry@5504} "title" -> "xxxxx"