Google Tasks使用什么时区?

时间:2017-10-03 14:16:11

标签: android datetime google-tasks

我正在使用QuickstartAPI reference对Google Tasks应用进行原型设计。检索任务没问题。问题是截止日期存储在什么时区?我将截止日期作为每个文档的DateTime检索,然后将其转换为默认(本地)时区中的显示值。

这是我观察到的:截止日期,例如"周三,10月4日和#34; (如果您将任务移至Google日历上的10月4日,您会获得什么)将被检索为"星期三,10月4日12:00 am" 在UTC ,以便当我将其转换为我的本地时区(PDT)时,我得到"星期二,10月3日下午5:00"。

这使我认为Google Tasks会以UTC格式存储所有任务日期和时间,然后将其解释为您当地时区的日期和时间(换句话说,如果我在纽约,它仍将存储在10月4日星期三这与我的观察结果一致,即如果您更改时区,任务截止日期不会在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());
  }

更新:明确证明Google Tasks使用UTC无论如何,这里是安排在10月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 个答案:

答案 0 :(得分:0)

由于您提到了Google日历,我认为this回答了这个问题:

夏令时

  

Google日历使用协调世界时(UTC)来帮助避免   夏令时问题。

     

创建事件时,它们会转换为UTC,但您将永远   在当地时间看他们。

     

如果某个区域切换了他们的时区,则在我们知道之前创建了事件   关于改变可能是在错误的时区。