【问题标题】:Coverting RFC 3339 DateTime Objects in Android returned from Google Tasks API to String将 Android 中从 Google Tasks API 返回的 RFC3339 DateTime 对象转换为字符串
【发布时间】:2012-07-29 04:32:07
【问题描述】:

我正在使用 Google Tasks API 返回值,例如任务标题、任务注释和任务到期日期。

当我尝试将到期日期 (stored as RFC 3339) 输出为字符串时,我得到 java.lang.IllegalArgumentException。

我正在尝试使用SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") 进行此转换。

我的猜测是 SimpleDateFormat 不是要走的路,但我尝试过的所有其他转换都失败了。我愿意使用 Joda ISODateFormat,但即使这样也没有用。我已经包含了相关的sn-ps代码。

我的任务(调用项)类定义是:

import com.google.api.client.util.DateTime;

public class Item {

Long id;
String title;   
String description;
String extId1;
Integer status;
DateTime dateDue;
DateTime dateLastEdit;
DateTime dateCompleted;

Item parent;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setNotes(String description) {
    this.description = description;
}

public String getExtId1() {
    return extId1;
}

public void setExtId1(String extId1) {
    this.extId1 = extId1;
}

public Integer getStatus() {
    return status;
}

public void setStatus(Integer status) {
    this.status = status;
}

public DateTime getDateDue() {
    return dateDue;
}

public void setDateDue(DateTime dateDue) {
    this.dateDue = dateDue;
}

public DateTime getDateLastEdit() {
    return dateLastEdit;
}

public void setDateLastEdit(DateTime dateLastEdit) {
    this.dateLastEdit = dateLastEdit;
}

public DateTime getDateCompleted() {
    return dateCompleted;
}

public void setDateCompleted(DateTime dateCompleted) {
    this.dateCompleted = dateCompleted;
}

public Item getParent() {
    return parent;
}

public void setParent(Item parent) {
    this.parent = parent;
}

}

为了看到这个出错,我演示了 doInBackground 方法,我尝试输出返回的日期:

@Override
protected List<Item> doInBackground(Void... arg0) {
  List<Item> itemList = new ArrayList<Item>();
  DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  Log.v(TAG, "Start doInBackground...");
  try {
      List<String> result = new ArrayList<String>();
      com.google.api.services.tasks.Tasks.TasksOperations.List listRequest = service.tasks().list("@default");
      listRequest.setFields("items/title,items/notes,items/due");
      List<Task> tasks = listRequest.execute().getItems();
      if (tasks != null) {            
          for (Task task : tasks) {
              result.add(task.getTitle());
              Item item = new Item();               
              item.setTitle(task.getTitle());
              item.setNotes(task.getNotes());
              DateTime due = task.getDue();
              item.setDateDue(due);
              Log.v(TAG, "Due date string: " + formatter.format(due));
              itemList.add(item);
          }
      } else {
          Log.v(TAG, "End doInBackground with no tasks");
          result.add("No tasks.");
      }       
      Log.v(TAG, "End doInBackground with tasks received");
      return itemList;           
  } catch (IOException e) {
      Log.v(TAG, "End doInBackground with IOException...");
      tasksSample.handleGoogleException(e);
      Item item = new Item();
      item.setTitle(e.getMessage());
      itemList.add(item);
      return itemList;
      //return Collections.singletonList(e.getMessage());
  } catch (Exception e2) {
      Log.v(TAG, "End doInBackground with generic exception...");
      e2.printStackTrace();
      Item item = new Item();
      item.setTitle(e2.getMessage());
      itemList.add(item);
      return itemList;
  } finally {
      tasksSample.onRequestCompleted();
  }
}

编辑:

根据要求,这是一个堆栈跟踪:

[java.text.DateFormat.format(DateFormat.java:365), java.text.Format.format(Format.java:93), com.google.api.services.samples.tasks.android.AsyncLoadTasks。 doInBackground(AsyncLoadTasks.java:78), com.google.api.services.samples.tasks.android.AsyncLoadTasks.doInBackground(AsyncLoadTasks.java:1), android.os.AsyncTask$2.call(AsyncTask.java:264), java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305), java.util.concurrent.FutureTask.run(FutureTask.java:137), android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java :208), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569), java.lang.Thread.run(Thread. java:856)]

这里是任务资源:

{"due":"2012-07-04T00:00:00.000Z","notes":"note1","title":"test1"}

【问题讨论】:

  • 请问,1) 发布错误的完整堆栈跟踪。 2) 提供从 Google Task 收到的资源数据,以便我们可以根据您的日期模式进行匹配?
  • 谢谢,我现在尝试添加两者。我对 Eclipse 不太熟悉,我从调试窗口的“变量”选项卡中获取了值。如果这不是这样做的方法,请纠正我。
  • 您的 cmets 让我对这个问题进行了一些思考,然后当我查看任务资源(作为复制/粘贴)时,我注意到了清晰的文本。似乎 Java 客户端库帮助程序类已经以字符串格式输出日期!所以需要转换任何东西。奇怪!

标签: java android jodatime datetime-format google-tasks-api


【解决方案1】:

看来Google Java客户端库辅助函数import com.google.api.client.util.DateTime;

已经返回一个文本字符串,不需要做转换。这不是我所期待的!

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2016-02-13
    • 1970-01-01
    • 2016-10-07
    • 2011-09-09
    相关资源
    最近更新 更多