root / trunk / Pithos.Interfaces / PithosDateTimeConverter.cs @ 275a059e
History | View | Annotate | Download (4.9 kB)
1 | 255f5f86 | Panagiotis Kanavos | #region |
---|---|---|---|
2 | 255f5f86 | Panagiotis Kanavos | /* ----------------------------------------------------------------------- |
3 | 255f5f86 | Panagiotis Kanavos | * <copyright file="PithosDateTimeConverter.cs" company="GRNet"> |
4 | 255f5f86 | Panagiotis Kanavos | * |
5 | 255f5f86 | Panagiotis Kanavos | * Copyright 2011-2012 GRNET S.A. All rights reserved. |
6 | 255f5f86 | Panagiotis Kanavos | * |
7 | 255f5f86 | Panagiotis Kanavos | * Redistribution and use in source and binary forms, with or |
8 | 255f5f86 | Panagiotis Kanavos | * without modification, are permitted provided that the following |
9 | 255f5f86 | Panagiotis Kanavos | * conditions are met: |
10 | 255f5f86 | Panagiotis Kanavos | * |
11 | 255f5f86 | Panagiotis Kanavos | * 1. Redistributions of source code must retain the above |
12 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
13 | 255f5f86 | Panagiotis Kanavos | * disclaimer. |
14 | 255f5f86 | Panagiotis Kanavos | * |
15 | 255f5f86 | Panagiotis Kanavos | * 2. Redistributions in binary form must reproduce the above |
16 | 255f5f86 | Panagiotis Kanavos | * copyright notice, this list of conditions and the following |
17 | 255f5f86 | Panagiotis Kanavos | * disclaimer in the documentation and/or other materials |
18 | 255f5f86 | Panagiotis Kanavos | * provided with the distribution. |
19 | 255f5f86 | Panagiotis Kanavos | * |
20 | 255f5f86 | Panagiotis Kanavos | * |
21 | 255f5f86 | Panagiotis Kanavos | * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
22 | 255f5f86 | Panagiotis Kanavos | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
23 | 255f5f86 | Panagiotis Kanavos | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | 255f5f86 | Panagiotis Kanavos | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
25 | 255f5f86 | Panagiotis Kanavos | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
26 | 255f5f86 | Panagiotis Kanavos | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
27 | 255f5f86 | Panagiotis Kanavos | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
28 | 255f5f86 | Panagiotis Kanavos | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
29 | 255f5f86 | Panagiotis Kanavos | * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | 255f5f86 | Panagiotis Kanavos | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
31 | 255f5f86 | Panagiotis Kanavos | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
32 | 255f5f86 | Panagiotis Kanavos | * POSSIBILITY OF SUCH DAMAGE. |
33 | 255f5f86 | Panagiotis Kanavos | * |
34 | 255f5f86 | Panagiotis Kanavos | * The views and conclusions contained in the software and |
35 | 255f5f86 | Panagiotis Kanavos | * documentation are those of the authors and should not be |
36 | 255f5f86 | Panagiotis Kanavos | * interpreted as representing official policies, either expressed |
37 | 255f5f86 | Panagiotis Kanavos | * or implied, of GRNET S.A. |
38 | 255f5f86 | Panagiotis Kanavos | * </copyright> |
39 | 255f5f86 | Panagiotis Kanavos | * ----------------------------------------------------------------------- |
40 | 255f5f86 | Panagiotis Kanavos | */ |
41 | 255f5f86 | Panagiotis Kanavos | #endregion |
42 | 9aa8abad | Panagiotis Kanavos | using System; |
43 | 9aa8abad | Panagiotis Kanavos | using System.Globalization; |
44 | 9aa8abad | Panagiotis Kanavos | using Newtonsoft.Json; |
45 | 9aa8abad | Panagiotis Kanavos | using Newtonsoft.Json.Converters; |
46 | 9aa8abad | Panagiotis Kanavos | using Newtonsoft.Json.Utilities; |
47 | 9aa8abad | Panagiotis Kanavos | |
48 | 9aa8abad | Panagiotis Kanavos | namespace Pithos.Interfaces |
49 | 9aa8abad | Panagiotis Kanavos | { |
50 | 9aa8abad | Panagiotis Kanavos | /// <summary> |
51 | 9aa8abad | Panagiotis Kanavos | /// Converts a <see cref="DateTime"/> to and from a JavaScript date constructor (e.g. new Date(52231943)). |
52 | 9aa8abad | Panagiotis Kanavos | /// </summary> |
53 | 9aa8abad | Panagiotis Kanavos | public class PithosDateTimeConverter : DateTimeConverterBase |
54 | 9aa8abad | Panagiotis Kanavos | { |
55 | 9aa8abad | Panagiotis Kanavos | private DateTime _epoch = new DateTime(1970, 1, 1,0,0,0,DateTimeKind.Utc); |
56 | 9aa8abad | Panagiotis Kanavos | |
57 | 9aa8abad | Panagiotis Kanavos | /// <summary> |
58 | 9aa8abad | Panagiotis Kanavos | /// Writes the JSON representation of the object. |
59 | 9aa8abad | Panagiotis Kanavos | /// </summary> |
60 | 9aa8abad | Panagiotis Kanavos | /// <param name="writer">The <see cref="JsonWriter"/> to write to.</param> |
61 | 9aa8abad | Panagiotis Kanavos | /// <param name="value">The value.</param> |
62 | 9aa8abad | Panagiotis Kanavos | /// <param name="serializer">The calling serializer.</param> |
63 | 9aa8abad | Panagiotis Kanavos | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) |
64 | 9aa8abad | Panagiotis Kanavos | { |
65 | 9aa8abad | Panagiotis Kanavos | double seconds; |
66 | 9aa8abad | Panagiotis Kanavos | |
67 | 9aa8abad | Panagiotis Kanavos | if (value is DateTime) |
68 | 9aa8abad | Panagiotis Kanavos | { |
69 | 5e31048f | Panagiotis Kanavos | var dateTime = (DateTime)value; |
70 | 5e31048f | Panagiotis Kanavos | var utcDateTime = dateTime.ToUniversalTime(); |
71 | 9aa8abad | Panagiotis Kanavos | seconds = (utcDateTime - _epoch).TotalSeconds; ; |
72 | 9aa8abad | Panagiotis Kanavos | } |
73 | 9aa8abad | Panagiotis Kanavos | else if (value is DateTimeOffset) |
74 | 9aa8abad | Panagiotis Kanavos | { |
75 | 5e31048f | Panagiotis Kanavos | var dateTimeOffset = (DateTimeOffset)value; |
76 | 5e31048f | Panagiotis Kanavos | var utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); |
77 | 9aa8abad | Panagiotis Kanavos | seconds= (utcDateTimeOffset.UtcDateTime - _epoch).TotalSeconds; |
78 | 9aa8abad | Panagiotis Kanavos | } |
79 | 9aa8abad | Panagiotis Kanavos | else |
80 | 9aa8abad | Panagiotis Kanavos | { |
81 | 9aa8abad | Panagiotis Kanavos | throw new Exception("Expected date object value."); |
82 | 9aa8abad | Panagiotis Kanavos | } |
83 | 9aa8abad | Panagiotis Kanavos | |
84 | 9aa8abad | Panagiotis Kanavos | writer.WriteValue(seconds); |
85 | 9aa8abad | Panagiotis Kanavos | } |
86 | 9aa8abad | Panagiotis Kanavos | |
87 | 9aa8abad | Panagiotis Kanavos | /// <summary> |
88 | 9aa8abad | Panagiotis Kanavos | /// Reads the JSON representation of the object. |
89 | 9aa8abad | Panagiotis Kanavos | /// </summary> |
90 | 9aa8abad | Panagiotis Kanavos | /// <param name="reader">The <see cref="JsonReader"/> to read from.</param> |
91 | 9aa8abad | Panagiotis Kanavos | /// <param name="objectType">Type of the object.</param> |
92 | 9aa8abad | Panagiotis Kanavos | /// <param name="existingValue">The existing property value of the JSON that is being converted.</param> |
93 | 9aa8abad | Panagiotis Kanavos | /// <param name="serializer">The calling serializer.</param> |
94 | 9aa8abad | Panagiotis Kanavos | /// <returns>The object value.</returns> |
95 | 9aa8abad | Panagiotis Kanavos | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) |
96 | 9aa8abad | Panagiotis Kanavos | { |
97 | 9aa8abad | Panagiotis Kanavos | Type t = (IsNullableType(objectType)) |
98 | 9aa8abad | Panagiotis Kanavos | ? Nullable.GetUnderlyingType(objectType) |
99 | 9aa8abad | Panagiotis Kanavos | : objectType; |
100 | 9aa8abad | Panagiotis Kanavos | |
101 | 9aa8abad | Panagiotis Kanavos | if (reader.TokenType == JsonToken.Null) |
102 | 9aa8abad | Panagiotis Kanavos | { |
103 | 9aa8abad | Panagiotis Kanavos | if (!IsNullableType(objectType)) |
104 | 9aa8abad | Panagiotis Kanavos | throw new Exception(String.Format("Cannot convert null value to {0}.",objectType)); |
105 | 9aa8abad | Panagiotis Kanavos | |
106 | 9aa8abad | Panagiotis Kanavos | return null; |
107 | 9aa8abad | Panagiotis Kanavos | } |
108 | 9aa8abad | Panagiotis Kanavos | |
109 | 9aa8abad | Panagiotis Kanavos | var seconds = double.Parse((string)reader.Value,CultureInfo.InvariantCulture); |
110 | 9aa8abad | Panagiotis Kanavos | |
111 | 9aa8abad | Panagiotis Kanavos | DateTime d = _epoch.AddSeconds(seconds); |
112 | 9aa8abad | Panagiotis Kanavos | |
113 | 9aa8abad | Panagiotis Kanavos | |
114 | 9aa8abad | Panagiotis Kanavos | if (t == typeof(DateTimeOffset)) |
115 | 9aa8abad | Panagiotis Kanavos | return new DateTimeOffset(d); |
116 | 9aa8abad | Panagiotis Kanavos | return d; |
117 | 9aa8abad | Panagiotis Kanavos | } |
118 | 9aa8abad | Panagiotis Kanavos | |
119 | 9aa8abad | Panagiotis Kanavos | public static bool IsNullableType(Type t) |
120 | 9aa8abad | Panagiotis Kanavos | { |
121 | 9aa8abad | Panagiotis Kanavos | if (t== null) |
122 | 9aa8abad | Panagiotis Kanavos | throw new ArgumentNullException("t"); |
123 | 9aa8abad | Panagiotis Kanavos | |
124 | 9aa8abad | Panagiotis Kanavos | return (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)); |
125 | 9aa8abad | Panagiotis Kanavos | } |
126 | 9aa8abad | Panagiotis Kanavos | } |
127 | 9aa8abad | Panagiotis Kanavos | } |