Skip to content

Commit e7828c8

Browse files
committed
Merge pull request ServiceStack#89 from mj1856/master
Further Improvemets for Date Handling
2 parents 5b7a176 + 6e614af commit e7828c8

11 files changed

Lines changed: 145 additions & 21 deletions

File tree

3.5 KB
Binary file not shown.

NuGet/lib/sl4/ServiceStack.Text.xml

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
3.5 KB
Binary file not shown.

NuGet/lib/sl5/ServiceStack.Text.xml

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ public static DateTime ParseDateTime(string dateTimeStr)
6464
return DateTime.ParseExact(dateTimeStr, XsdDateTimeFormat, null);
6565
}
6666

67+
public static DateTimeOffset ParseDateTimeOffset(string dateTimeOffsetStr)
68+
{
69+
// assume utc when no offset specified
70+
if (dateTimeOffsetStr.LastIndexOfAny(TimeZoneChars) < 10 && !dateTimeOffsetStr.EndsWith("Z"))
71+
dateTimeOffsetStr += "Z";
72+
73+
return DateTimeOffset.Parse(dateTimeOffsetStr);
74+
}
75+
6776
public static string ToXsdDateTimeString(DateTime dateTime)
6877
{
6978
return XmlConvert.ToString(dateTime.ToStableUniversalTime(), XmlDateTimeSerializationMode.Utc);
@@ -138,7 +147,7 @@ public static string ToWcfJsonDate(DateTime dateTime)
138147
{
139148
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
140149
{
141-
return EscapedWcfJsonPrefix + dateTime.ToString("o", CultureInfo.InvariantCulture) + EscapedWcfJsonSuffix;
150+
return dateTime.ToString("o", CultureInfo.InvariantCulture);
142151
}
143152

144153
var timestamp = dateTime.ToUnixTimeMs();
@@ -148,5 +157,20 @@ public static string ToWcfJsonDate(DateTime dateTime)
148157

149158
return EscapedWcfJsonPrefix + timestamp + offset + EscapedWcfJsonSuffix;
150159
}
160+
161+
public static string ToWcfJsonDateTimeOffset(DateTimeOffset dateTimeOffset)
162+
{
163+
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
164+
{
165+
return dateTimeOffset.ToString("o", CultureInfo.InvariantCulture);
166+
}
167+
168+
var timestamp = dateTimeOffset.DateTime.ToUnixTimeMs();
169+
var offset = dateTimeOffset.Offset == TimeSpan.Zero
170+
? string.Empty
171+
: dateTimeOffset.Offset.ToTimeOffsetString();
172+
173+
return EscapedWcfJsonPrefix + timestamp + offset + EscapedWcfJsonSuffix;
174+
}
151175
}
152176
}

src/ServiceStack.Text/Common/DeserializeBuiltin.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ private static ParseStringDelegate GetParseFn()
5454
return value => new Guid(value);
5555
if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?))
5656
return value => DateTimeSerializer.ParseShortestXsdDateTime(value);
57+
if (typeof(T) == typeof(DateTimeOffset) || typeof(T) == typeof(DateTimeOffset?))
58+
return value => DateTimeSerializer.ParseDateTimeOffset(value);
5759
if (typeof(T) == typeof(TimeSpan))
5860
return value => TimeSpan.Parse(value);
5961
#if !MONOTOUCH && !SILVERLIGHT && !XBOX

src/ServiceStack.Text/Common/ITypeSerializer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ internal interface ITypeSerializer
2121
void WriteString(TextWriter writer, string value);
2222
void WriteDateTime(TextWriter writer, object oDateTime);
2323
void WriteNullableDateTime(TextWriter writer, object dateTime);
24+
void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset);
25+
void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset);
2426
void WriteGuid(TextWriter writer, object oValue);
2527
void WriteNullableGuid(TextWriter writer, object oValue);
2628
void WriteBytes(TextWriter writer, object oByteValue);

src/ServiceStack.Text/Common/JsWriter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@ public WriteObjectDelegate GetValueTypeToStringMethod(Type type)
165165
if (type == typeof(DateTime?))
166166
return Serializer.WriteNullableDateTime;
167167

168+
if (type == typeof(DateTimeOffset))
169+
return Serializer.WriteDateTimeOffset;
170+
171+
if (type == typeof(DateTimeOffset?))
172+
return Serializer.WriteNullableDateTimeOffset;
173+
168174
if (type == typeof(Guid))
169175
return Serializer.WriteGuid;
170176

src/ServiceStack.Text/Json/JsonTypeSerializer.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ public void WriteNullableDateTime(TextWriter writer, object dateTime)
113113
WriteDateTime(writer, dateTime);
114114
}
115115

116+
public void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset)
117+
{
118+
WriteRawString(writer, DateTimeSerializer.ToWcfJsonDateTimeOffset((DateTimeOffset)oDateTimeOffset));
119+
}
120+
121+
public void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset)
122+
{
123+
if (dateTimeOffset == null)
124+
writer.Write(JsonUtils.Null);
125+
else
126+
WriteDateTimeOffset(writer, dateTimeOffset);
127+
}
128+
116129
public void WriteGuid(TextWriter writer, object oValue)
117130
{
118131
WriteRawString(writer, ((Guid)oValue).ToString("N"));

src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ public void WriteNullableDateTime(TextWriter writer, object dateTime)
8686
writer.Write(DateTimeSerializer.ToShortestXsdDateTimeString((DateTime)dateTime));
8787
}
8888

89+
public void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset)
90+
{
91+
writer.Write(((DateTimeOffset) oDateTimeOffset).ToString("o"));
92+
}
93+
94+
public void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset)
95+
{
96+
if (dateTimeOffset == null) return;
97+
this.WriteDateTimeOffset(writer, dateTimeOffset);
98+
}
99+
89100
public void WriteGuid(TextWriter writer, object oValue)
90101
{
91102
writer.Write(((Guid)oValue).ToString("N"));

0 commit comments

Comments
 (0)