質問

私はNewtonsoftのJSONシリアライザを使用してオブジェクトをシリアライズしました、と日時はなどを通じて来てます:

/Date(1237588418563+0000)/

ときI $ .evalJSON()その上で、それが対象ですが、私はそれににtoUTCStringのような任意の通常の日付の方法を見つけることができません。

任意のアイデアを、私はこれで何ができるか?

役に立ちましたか?

解決

より良いフォーマットを取得するには日付を扱うため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と私はUTCからユーザーのタイムゾーンに日付を変換することができますのTimeZoneInfo、ます:

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 Classクラスを使用し、そのItemConverterTypeプロパティのプロパティを設定します。 使用方法:

// class to be serialized
public class MyClass
{
    [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
    public DateTime? DateTime1;
    public DateTime? DateTime2;
}

私はこれが宣言されていないだけで1前にこのクラスのすべてのプロパティに対してDateTimeConverterを設定します観察してきたように。

同じ問題に遭遇した、とアダムからのリンクに基づいて解決策を見つけます:

new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));

これは、Javascriptを簡単に日付オブジェクトに変換することができるUnixタイムスタンプ、のように見えます。 - 0は、私はあなたがsubstrのルックスが好きではない場合は、同様にそれをNumber()ことができると思います... Javascriptを整数として- 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のようなものを使用せずに解雇してJSONオブジェクトを修正する方が良いでしょう()またはウィンドウ[]。たぶんjQueryのインチわからない。

+することができ、オフセットとだけのために-ないことを忘れてはいけないオフセット!

申し訳ありませんが、私は単純化ビット@Jamesニュートン・キング

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    
ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

これは私のために動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top