NewtonsoftのJSONシリアライザーを使用してオブジェクトをシリアル化しましたが、DateTimeは次のようになりました。
/Date(1237588418563+0000)/
その上で$ .evalJSON()を実行すると、オブジェクトになりますが、toUTCStringのような通常のDateメソッドは見つかりません。
これでできることはありますか?
Json.NETに付属のJsonConvertersのいずれかを使用して、日付を操作してより良い形式を取得します。 JavaScriptDateTimeConverterは自動的にJavaScript日付を提供します。
public class LogEntry
{
public string Details { get; set; }
public DateTime LogDate { get; set; }
}
[Test]
public void WriteJsonDates()
{
LogEntry entry = new LogEntry
{
LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),
Details = "Application started."
};
string defaultJson = JsonConvert.SerializeObject(entry);
// {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}
string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
// {"Details":"Application started.","LogDate":new Date(1234656000000)}
string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());
// {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}
}
ドキュメント: Json.NETでJSONの日付をシリアル化する
私は、ある人にとっては役に立つかもしれない別のアプローチを思いつきました。基本的に、独自のCustomDateConverterを作成し、必要なときに呼び出します。コンバーターは2つのパラメーター、日付形式、たとえばyyyy-MM-dd HH:mm:ss
およびTimeZoneInfo。これにより、日付をUTCからユーザーのタイムゾーンに変換できます。
public class JSONCustomDateConverter : DateTimeConverterBase
{
private TimeZoneInfo _timeZoneInfo;
private string _dateFormat;
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
{
_dateFormat = dateFormat;
_timeZoneInfo = timeZoneInfo;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
writer.Flush();
}
次のように使用できます。
var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });
カスタムの日付フォーマットのみが必要な場合は、明らかにタイムゾーンに関連するものをすべて削除できます。助けたことを教えてください!
Newtonsoft Json.Netバージョン4.5r5では、JsonPropertyAttributeクラスクラスを使用して、そのItemConverterTypeプロパティプロパティを設定します。使用法:
// class to be serialized
public class MyClass
{
[JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
public DateTime? DateTime1;
public DateTime? DateTime2;
}
私が観察したように、これは、宣言される前のものだけでなく、このクラスのすべてのプロパティにDateTimeConverterを設定します。
同じ問題にぶつかり、Adamからのリンクに基づいた解決策を見つけました。
new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));
これは、Unicodeのタイムスタンプのように見えます。javascriptは、これを日付オブジェクトに簡単に変換できます。 - 0
は、javascriptがsubstr
出力を整数として扱うようにすることです... Number()
も、- 0
JSONオブジェクトには次のようなものが含まれていました。
var data = {"CreatedDate":"/Date(1327572000000-1000)/"});
///
var oddDateTimeZone = data.CreatedDate;
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));
ただし、eval()やwindow []のようなものを使用せずに日付関数が起動するように、JSONオブジェクトを修正することをお勧めします。たぶんjQueryで。わからない。
オフセットは+
であり、オフセットの-
である可能性があることを忘れないでください!