2016-03-01 73 views
5

我正在使用適用於Android的Azure移動應用程序SDK。從Android發送DateTimeOffset到.NET Web API

public class MyClass { 
    public String Id; 
    public String Code; 
    public DateTimeOffset ClientCreatedAt; 
} 

MyClass myClass = new MyClass(); 
myClass.Id = "1234567890"; 
myClass.Code = "dfgdrvyet"; 
myClass.ClientCreatedAt = new DateTimeOffset(new Date()); 

它被用作如下:

MobileServiceSyncTable<MyClass> myClassSyncTable = _client.getSyncTable(MyClass.class); 
ListenableFuture<MyClass> responseFuture = myClassSyncTable.insert(myClass); 

在插入時的ClientCreatedAt設置爲null,當我調查的INSERT語句,它是不連載的庫中的GSON DATETIMEOFFSET,具體地,這條線:

JsonObject json = mClient.getGsonBuilder().create().toJsonTree(item).getAsJsonObject(); 

當我更換DateTimeOffsetDate,該值是串行化的PR operly。

所以,我的問題是:

  1. 並非意在Azure的移動應用程序,我使用的DateTimeOffset,如果是這樣,什麼是使用它的正確方法?
  2. 我可以強制Gson正確連載DateTimeOffset嗎?我看了Gson註釋,但沒有什麼可以幫到那裏。我不確定是否應該創建一個getter和setter用於序列化和反序列化。

回答

0

如果不是遲到回答。我有同樣的問題。您可以使用
Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String formattedDate = df.format(c.getTime()); 解析日期。恕我直言,將更容易使用Gson和Volley。我認爲你可以將它作爲字符串讀取,然後將其轉換爲Date。

+0

這是關於DateTimeOffset Azure SDK類的嗎? – Adam

+0

我的意思是在類中使用字符串,但在此格式類型中插入日期。像這樣的東西 '公共類MyClass {0}公共字符串ID; public String ClientCreatedAt; } MyClass inst = new MyClass(); inst.ClientCreatedAt = df.Format(c.getTime);' – Airat

+0

我的問題是不同的,無論如何謝謝:) – Adam

2

DateTimeOffset實際上是Date的愚蠢包裝。這是完整的。

/** 
* Represents a point in time, typically expressed as a date and time of day 
*/ 
public class DateTimeOffset extends Date { 

    public DateTimeOffset(Date date) { 
     this.setTime(date.getTime()); 
    } 
} 

我把我的手在空中,只是決定用字符串代替,並通過DateTime.parse(string)喬達時間的DateTime類來處理它們。

然而,不錯的選擇可能是通過MobileServiceClient.registerSerializer(...)註冊自己的序列化程序,但是使用它們的包裝程序不會有用。

這個SDK是垃圾。

編輯:使用一個定製的(反)串行器似乎工作得很好:

private class DateTimeSerialiser implements JsonSerializer<DateTime>, JsonDeserializer<DateTime> { 
    @Override 
    public JsonElement serialize(final DateTime src, final Type typeOfSrc, final JsonSerializationContext context) { 
     return new JsonPrimitive(src.toString()); 
    } 

    @Override 
    public DateTime deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { 
     return DateTime.parse(json.getAsString()); 
    } 
} 

設置它deserialise /還原序列化到/從你選擇的對象,然後通過MobileServiceClient.registerSerializer + registerDeserializer設置它的一個實例。如果使用本地同步,只需使用ColumnDataType.StringColumnDataType.DateTimeOffset(它只是引擎蓋下的字符串)。現在你可以將你的領域設置爲你想要的類型。

private DateTime date;