我正在使用Google Tasks API返回值,例如任務標題,任務註釋和任務截止日期。隱藏從Google Tasks API返回的Android中的RFC 3339 DateTime對象字符串
當我嘗試輸出截止日期(stored as RFC 3339)作爲字符串時,我得到java.lang.IllegalArgumentException
。
我想用SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
來做這個轉換。
我的猜測是,SimpleDateFormat
是不是要走的路,但我嘗試過的每一個轉換失敗。我願意使用Joda ISODateFormat
,但即使這樣也行不通。我已經包含了相關的代碼片段。
我的任務(呼叫項目)類的定義是:
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: (ThreadPoolExecutor.java:569),java.lang.Thread.run(Thread.java) :856)]
以下是任務資源:
{ 「由於」: 「2012-07-04T00:00:00.000Z」, 「注意事項」: 「注1」, 「稱號」: 「測試1」}
您可以請,1)發佈錯誤的完整堆棧跟蹤。 2)提供從谷歌任務收到的資源數據,以便我們可以匹配它從你的日期模式? – 2012-07-31 12:07:59
謝謝,我現在嘗試添加兩個。我不熟悉Eclipse,我從調試窗口中的「變量」選項卡中獲取了值。請糾正我,如果不是這樣做的話。 – 2012-07-31 12:23:51
你的評論讓我想起了這個問題,然後當我看到任務資源(複製/粘貼)時,我注意到了明文。看起來Java客戶端庫幫助類已經以字符串格式輸出日期!所以需要轉換任何東西。奇怪的! – 2012-07-31 12:37:09