Какой часовой пояс использует Google Tasks?

Я создаю прототип приложения Google Tasks, используя Quickstart и справочник по API. Нет проблем с получением задач. Вопрос в том, в каком часовом поясе хранится Дата исполнения? Я извлекаю дату исполнения как дату и время для каждого документа, а затем преобразовываю ее в отображаемое значение в моем часовом поясе по умолчанию (локальном).

Вот что я наблюдаю: срок исполнения, например, "среда, 4 октября" (то, что вы получите, если переместите задачу на 4 октября в календаре Google), определяется как "среда, 4 октября, 12:00 утра" в UTC, так что, когда я конвертирую его в свой местный часовой пояс (PDT), я получаю "вторник, 3 октября, 5:00 вечера".

Это заставляет меня думать, что Google Tasks хранит все даты и время Задачи в UTC, а затем интерпретирует их как даты и время в вашем местном часовом поясе (другими словами, если бы я был в Нью-Йорке, он все равно сохранял бы среду, 4 октября, 12:00). в UTC. Это согласуется с моим наблюдением о том, что при изменении часовых поясов сроки выполнения задач не изменяются в интерфейсе Календаря Google.

Кто-нибудь может подтвердить или опровергнуть?

Вот мои фрагменты кода, в основном, после быстрого старта. Fetching...

    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());
  }

ОБНОВЛЕНИЕ: Явное доказательство того, что Google Tasks использует UTC независимо от этого, вот отладочное представление Задачи, запланированной на 3 октября:

    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"

1 ответ

Поскольку вы упомянули Календарь Google, я думаю, что это ответ на этот вопрос:

Летнее время

Календарь Google использует Всемирное координированное время (UTC), чтобы избежать проблем с переходом на летнее время.

Когда события создаются, они конвертируются в UTC, но вы всегда будете видеть их по местному времени.

Если область переключает свой часовой пояс, события, созданные до того, как мы узнали об изменении, могут быть в неправильном часовом поясе.

Другие вопросы по тегам