#region /* ----------------------------------------------------------------------- * * * Copyright 2011-2012 GRNET S.A. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and * documentation are those of the authors and should not be * interpreted as representing official policies, either expressed * or implied, of GRNET S.A. * * ----------------------------------------------------------------------- */ #endregion using System; using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Utilities; namespace Pithos.Interfaces { /// /// Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). /// public class PithosDateTimeConverter : DateTimeConverterBase { private DateTime _epoch = new DateTime(1970, 1, 1,0,0,0,DateTimeKind.Utc); /// /// Writes the JSON representation of the object. /// /// The to write to. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { double seconds; if (value is DateTime) { var dateTime = (DateTime)value; var utcDateTime = dateTime.ToUniversalTime(); seconds = (utcDateTime - _epoch).TotalSeconds; ; } else if (value is DateTimeOffset) { var dateTimeOffset = (DateTimeOffset)value; var utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); seconds= (utcDateTimeOffset.UtcDateTime - _epoch).TotalSeconds; } else { throw new Exception("Expected date object value."); } writer.WriteValue(seconds); } /// /// Reads the JSON representation of the object. /// /// The to read from. /// Type of the object. /// The existing property value of the JSON that is being converted. /// The calling serializer. /// The object value. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { Type t = (IsNullableType(objectType)) ? Nullable.GetUnderlyingType(objectType) : objectType; if (reader.TokenType == JsonToken.Null) { if (!IsNullableType(objectType)) throw new Exception(String.Format("Cannot convert null value to {0}.",objectType)); return null; } var seconds = double.Parse((string)reader.Value,CultureInfo.InvariantCulture); DateTime d = _epoch.AddSeconds(seconds); if (t == typeof(DateTimeOffset)) return new DateTimeOffset(d); return d; } public static bool IsNullableType(Type t) { if (t== null) throw new ArgumentNullException("t"); return (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)); } } }