Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified NuGet/lib/sl4/ServiceStack.Text.dll
Binary file not shown.
14 changes: 7 additions & 7 deletions NuGet/lib/sl4/ServiceStack.Text.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified NuGet/lib/sl5/ServiceStack.Text.dll
Binary file not shown.
14 changes: 7 additions & 7 deletions NuGet/lib/sl5/ServiceStack.Text.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 25 additions & 1 deletion src/ServiceStack.Text/Common/DateTimeSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ public static DateTime ParseDateTime(string dateTimeStr)
return DateTime.ParseExact(dateTimeStr, XsdDateTimeFormat, null);
}

public static DateTimeOffset ParseDateTimeOffset(string dateTimeOffsetStr)
{
// assume utc when no offset specified
if (dateTimeOffsetStr.LastIndexOfAny(TimeZoneChars) < 10 && !dateTimeOffsetStr.EndsWith("Z"))
dateTimeOffsetStr += "Z";

return DateTimeOffset.Parse(dateTimeOffsetStr);
}

public static string ToXsdDateTimeString(DateTime dateTime)
{
return XmlConvert.ToString(dateTime.ToStableUniversalTime(), XmlDateTimeSerializationMode.Utc);
Expand Down Expand Up @@ -138,7 +147,7 @@ public static string ToWcfJsonDate(DateTime dateTime)
{
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
{
return EscapedWcfJsonPrefix + dateTime.ToString("o", CultureInfo.InvariantCulture) + EscapedWcfJsonSuffix;
return dateTime.ToString("o", CultureInfo.InvariantCulture);
}

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

return EscapedWcfJsonPrefix + timestamp + offset + EscapedWcfJsonSuffix;
}

public static string ToWcfJsonDateTimeOffset(DateTimeOffset dateTimeOffset)
{
if (JsConfig.DateHandler == JsonDateHandler.ISO8601)
{
return dateTimeOffset.ToString("o", CultureInfo.InvariantCulture);
}

var timestamp = dateTimeOffset.DateTime.ToUnixTimeMs();
var offset = dateTimeOffset.Offset == TimeSpan.Zero
? string.Empty
: dateTimeOffset.Offset.ToTimeOffsetString();

return EscapedWcfJsonPrefix + timestamp + offset + EscapedWcfJsonSuffix;
}
}
}
2 changes: 2 additions & 0 deletions src/ServiceStack.Text/Common/DeserializeBuiltin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ private static ParseStringDelegate GetParseFn()
return value => new Guid(value);
if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?))
return value => DateTimeSerializer.ParseShortestXsdDateTime(value);
if (typeof(T) == typeof(DateTimeOffset) || typeof(T) == typeof(DateTimeOffset?))
return value => DateTimeSerializer.ParseDateTimeOffset(value);
if (typeof(T) == typeof(TimeSpan))
return value => TimeSpan.Parse(value);
#if !MONOTOUCH && !SILVERLIGHT && !XBOX
Expand Down
2 changes: 2 additions & 0 deletions src/ServiceStack.Text/Common/ITypeSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ internal interface ITypeSerializer
void WriteString(TextWriter writer, string value);
void WriteDateTime(TextWriter writer, object oDateTime);
void WriteNullableDateTime(TextWriter writer, object dateTime);
void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset);
void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset);
void WriteGuid(TextWriter writer, object oValue);
void WriteNullableGuid(TextWriter writer, object oValue);
void WriteBytes(TextWriter writer, object oByteValue);
Expand Down
6 changes: 6 additions & 0 deletions src/ServiceStack.Text/Common/JsWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,12 @@ public WriteObjectDelegate GetValueTypeToStringMethod(Type type)
if (type == typeof(DateTime?))
return Serializer.WriteNullableDateTime;

if (type == typeof(DateTimeOffset))
return Serializer.WriteDateTimeOffset;

if (type == typeof(DateTimeOffset?))
return Serializer.WriteNullableDateTimeOffset;

if (type == typeof(Guid))
return Serializer.WriteGuid;

Expand Down
13 changes: 13 additions & 0 deletions src/ServiceStack.Text/Json/JsonTypeSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,19 @@ public void WriteNullableDateTime(TextWriter writer, object dateTime)
WriteDateTime(writer, dateTime);
}

public void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset)
{
WriteRawString(writer, DateTimeSerializer.ToWcfJsonDateTimeOffset((DateTimeOffset)oDateTimeOffset));
}

public void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset)
{
if (dateTimeOffset == null)
writer.Write(JsonUtils.Null);
else
WriteDateTimeOffset(writer, dateTimeOffset);
}

public void WriteGuid(TextWriter writer, object oValue)
{
WriteRawString(writer, ((Guid)oValue).ToString("N"));
Expand Down
11 changes: 11 additions & 0 deletions src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,17 @@ public void WriteNullableDateTime(TextWriter writer, object dateTime)
writer.Write(DateTimeSerializer.ToShortestXsdDateTimeString((DateTime)dateTime));
}

public void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset)
{
writer.Write(((DateTimeOffset) oDateTimeOffset).ToString("o"));
}

public void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset)
{
if (dateTimeOffset == null) return;
this.WriteDateTimeOffset(writer, dateTimeOffset);
}

public void WriteGuid(TextWriter writer, object oValue)
{
writer.Write(((Guid)oValue).ToString("N"));
Expand Down
78 changes: 72 additions & 6 deletions tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ public void Can_serialize_json_date_iso8601_utc()
var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Utc);
var ssJson = JsonSerializer.SerializeToString(dateTime);

Assert.That(ssJson, Is.EqualTo(@"""\/Date(1994-11-24T12:34:56.0000000Z)\/"""));
Assert.That(ssJson, Is.EqualTo(@"""1994-11-24T12:34:56.0000000Z"""));
JsConfig.Reset();
}

Expand All @@ -206,7 +206,7 @@ public void Can_serialize_json_date_iso8601_local()
var offsetSpan = TimeZoneInfo.Local.GetUtcOffset(dateTime);
var offset = offsetSpan.ToTimeOffsetString(true);

Assert.That(ssJson, Is.EqualTo(@"""\/Date(1994-11-24T12:34:56.0000000" + offset + @")\/"""));
Assert.That(ssJson, Is.EqualTo(@"""1994-11-24T12:34:56.0000000" + offset + @""""));
JsConfig.Reset();
}

Expand All @@ -218,7 +218,7 @@ public void Can_serialize_json_date_iso8601_unspecified()
var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Unspecified);
var ssJson = JsonSerializer.SerializeToString(dateTime);

Assert.That(ssJson, Is.EqualTo(@"""\/Date(1994-11-24T12:34:56.0000000)\/"""));
Assert.That(ssJson, Is.EqualTo(@"""1994-11-24T12:34:56.0000000"""));
JsConfig.Reset();
}

Expand All @@ -227,7 +227,7 @@ public void Can_deserialize_json_date_iso8601_withZOffset_asUtc()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

const string json = @"""\/Date(1994-11-24T12:34:56Z)\/""";
const string json = @"""1994-11-24T12:34:56Z""";
var fromJson = JsonSerializer.DeserializeFromString<DateTime>(json);

var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Utc);
Expand All @@ -241,7 +241,7 @@ public void Can_deserialize_json_date_iso8601_withoutOffset_asUnspecified()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

const string json = @"""\/Date(1994-11-24T12:34:56)\/""";
const string json = @"""1994-11-24T12:34:56""";
var fromJson = JsonSerializer.DeserializeFromString<DateTime>(json);

var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Unspecified);
Expand All @@ -258,7 +258,7 @@ public void Can_deserialize_json_date_iso8601_withOffset_asLocal()
var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Local);
var offset = TimeZoneInfo.Local.GetUtcOffset(dateTime).ToTimeOffsetString(true);

var json = @"""\/Date(1994-11-24T12:34:56" + offset + @")\/""";
var json = @"""1994-11-24T12:34:56" + offset + @"""";
var fromJson = JsonSerializer.DeserializeFromString<DateTime>(json);


Expand All @@ -267,6 +267,72 @@ public void Can_deserialize_json_date_iso8601_withOffset_asLocal()
JsConfig.Reset();
}

#endregion

#region ISO-8601 TimeStampOffset Tests
[Test]
public void Can_serialize_json_datetimeoffset_iso8601_utc()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

var dateTimeOffset = new DateTimeOffset(1994, 11, 24, 12, 34, 56, TimeSpan.Zero);
var ssJson = JsonSerializer.SerializeToString(dateTimeOffset);

Assert.That(ssJson, Is.EqualTo(@"""1994-11-24T12:34:56.0000000+00:00"""));
JsConfig.Reset();
}

[Test]
public void Can_serialize_json_datetimeoffset_iso8601_specified()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

var dateTimeOffset = new DateTimeOffset(1994, 11, 24, 12, 34, 56, TimeSpan.FromHours(-7));
var ssJson = JsonSerializer.SerializeToString(dateTimeOffset);

Assert.That(ssJson, Is.EqualTo(@"""1994-11-24T12:34:56.0000000-07:00"""));
JsConfig.Reset();
}

[Test]
public void Can_deserialize_json_datetimeoffset_iso8601_withZOffset_asUtc()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

const string json = @"""1994-11-24T12:34:56Z""";
var fromJson = JsonSerializer.DeserializeFromString<DateTimeOffset>(json);

var dateTimeOffset = new DateTimeOffset(1994, 11, 24, 12, 34, 56, TimeSpan.Zero);
Assert.That(fromJson, Is.EqualTo(dateTimeOffset));
JsConfig.Reset();
}

[Test]
public void Can_deserialize_json_datetimeoffset_iso8601_withoutOffset_asUtc()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

const string json = @"""1994-11-24T12:34:56""";
var fromJson = JsonSerializer.DeserializeFromString<DateTimeOffset>(json);

var dateTimeOffset = new DateTimeOffset(1994, 11, 24, 12, 34, 56, TimeSpan.Zero);
Assert.That(fromJson, Is.EqualTo(dateTimeOffset));
JsConfig.Reset();
}

[Test]
public void Can_deserialize_json_datetimeoffset_iso8601_withOffset_asSpecified()
{
JsConfig.DateHandler = JsonDateHandler.ISO8601;

var dateTimeOffset = new DateTimeOffset(1994, 11, 24, 12, 34, 56, TimeSpan.FromHours(-7));

const string json = @"""1994-11-24T12:34:56-07:00""";
var fromJson = JsonSerializer.DeserializeFromString<DateTimeOffset>(json);

Assert.That(fromJson, Is.EqualTo(dateTimeOffset));
JsConfig.Reset();
}
#endregion
}
}