Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

CsvSerializer respects the configured CsvConfig.DateTimeFormatString #405

Merged
merged 1 commit into from
Apr 9, 2014
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
19 changes: 18 additions & 1 deletion src/ServiceStack.Text/CsvConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,14 +110,31 @@ public static string RowSeparatorString
ResetEscapeStrings();
}
}


[ThreadStatic]
private static string tsDateTimeFormatString;
private static string sDateTimeFormatString;
public static string DateTimeFormatString
{
get
{
return tsDateTimeFormatString ?? sDateTimeFormatString ?? "";
}
set
{
tsDateTimeFormatString = value;
if (sDateTimeFormatString == null) sDateTimeFormatString = value;
}
}

public static void Reset()
{
tsItemSeperatorString = sItemSeperatorString = null;
tsItemDelimiterString = sItemDelimiterString = null;
tsEscapedItemDelimiterString = sEscapedItemDelimiterString = null;
tsRowSeparatorString = sRowSeparatorString = null;
tsEscapeStrings = sEscapeStrings = null;
tsDateTimeFormatString = sDateTimeFormatString = null;
}

}
Expand Down
17 changes: 17 additions & 0 deletions src/ServiceStack.Text/TextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,23 @@ public static string ToCsvField(this string text)
);
}

public static string ToCsvField(this DateTime value)
{
return !JsWriter.HasAnyEscapeChars(value.ToString())
? value.ToString(CsvConfig.DateTimeFormatString)
: string.Concat
(
JsWriter.QuoteString,
value.ToString(CsvConfig.DateTimeFormatString).Replace(JsWriter.QuoteString, TypeSerializer.DoubleQuoteString),
JsWriter.QuoteString
);
}

public static string ToCsvField(this DateTime? value)
{
return value.HasValue ? value.Value.ToCsvField() : null;
}

public static object ToCsvField(this object text)
{
return text == null || !JsWriter.HasAnyEscapeChars(text.ToString())
Expand Down
33 changes: 33 additions & 0 deletions tests/ServiceStack.Text.Tests/CsvStreamTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,39 @@ public void Can_convert_to_csv_field()
Assert.That("7,7.1".ToCsvField(), Is.EqualTo("\"7,7.1\""));
Assert.That("\"7,7.1\"".ToCsvField(), Is.EqualTo("\"\"\"7,7.1\"\"\""));
}

[Test]
public void Can_convert_to_csv_field_from_datetime_respecting_configured_datetimeformat()
{
var dateTime = DateTime.Now;
var testCases = new[] { "yyyy-MM-ddTHH:mm:ss.fff zzzz", "MM/dd/yyyy", "dd/MM/yyyy", "HH:mm:ss", "arbitrary string" };
foreach (var format in testCases)
{
CsvConfig.DateTimeFormatString = format;
Assert.That(dateTime.ToCsvField(),Is.EqualTo("\"" + dateTime.ToString(format) + "\""));
}
}

[Test]
public void Can_convert_to_csv_field_from_nullabledatetime_respecting_configured_datetimeformat()
{
DateTime? dateTime = DateTime.Now;
var testCases = new[] { "yyyy-MM-ddTHH:mm:ss.fff zzzz", "MM/dd/yyyy", "dd/MM/yyyy", "HH:mm:ss", "arbitrary string" };
foreach (var format in testCases)
{
CsvConfig.DateTimeFormatString = format;
Assert.That(dateTime.ToCsvField(), Is.EqualTo("\"" + dateTime.Value.ToString(format) + "\""));
}
DateTime? nullDateTime = null;
Assert.That(nullDateTime.ToCsvField(), Is.EqualTo(null));
}

[Test]
public void Can_convert_to_csv_field_from_datetime_without_a_configured_datetimeformat()
{
CsvConfig.Reset();
Assert.That(DateTime.Now.ToCsvField(), Is.EqualTo("\"" + DateTime.Now + "\""));
}

[Test]
public void Can_convert_to_csv_field_pipe_separator()
Expand Down