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

Commit d9a4e7a

Browse files
committed
Merge pull request #405 from chrisfcarroll/master
CsvSerializer respects the configured CsvConfig.DateTimeFormatString
2 parents 8c32aea + e60542a commit d9a4e7a

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

src/ServiceStack.Text/CsvConfig.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,31 @@ public static string RowSeparatorString
110110
ResetEscapeStrings();
111111
}
112112
}
113-
113+
114+
[ThreadStatic]
115+
private static string tsDateTimeFormatString;
116+
private static string sDateTimeFormatString;
117+
public static string DateTimeFormatString
118+
{
119+
get
120+
{
121+
return tsDateTimeFormatString ?? sDateTimeFormatString ?? "";
122+
}
123+
set
124+
{
125+
tsDateTimeFormatString = value;
126+
if (sDateTimeFormatString == null) sDateTimeFormatString = value;
127+
}
128+
}
129+
114130
public static void Reset()
115131
{
116132
tsItemSeperatorString = sItemSeperatorString = null;
117133
tsItemDelimiterString = sItemDelimiterString = null;
118134
tsEscapedItemDelimiterString = sEscapedItemDelimiterString = null;
119135
tsRowSeparatorString = sRowSeparatorString = null;
120136
tsEscapeStrings = sEscapeStrings = null;
137+
tsDateTimeFormatString = sDateTimeFormatString = null;
121138
}
122139

123140
}

src/ServiceStack.Text/TextExtensions.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ public static string ToCsvField(this string text)
3131
);
3232
}
3333

34+
public static string ToCsvField(this DateTime value)
35+
{
36+
return !JsWriter.HasAnyEscapeChars(value.ToString())
37+
? value.ToString(CsvConfig.DateTimeFormatString)
38+
: string.Concat
39+
(
40+
JsWriter.QuoteString,
41+
value.ToString(CsvConfig.DateTimeFormatString).Replace(JsWriter.QuoteString, TypeSerializer.DoubleQuoteString),
42+
JsWriter.QuoteString
43+
);
44+
}
45+
46+
public static string ToCsvField(this DateTime? value)
47+
{
48+
return value.HasValue ? value.Value.ToCsvField() : null;
49+
}
50+
3451
public static object ToCsvField(this object text)
3552
{
3653
return text == null || !JsWriter.HasAnyEscapeChars(text.ToString())

tests/ServiceStack.Text.Tests/CsvStreamTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,39 @@ public void Can_convert_to_csv_field()
179179
Assert.That("7,7.1".ToCsvField(), Is.EqualTo("\"7,7.1\""));
180180
Assert.That("\"7,7.1\"".ToCsvField(), Is.EqualTo("\"\"\"7,7.1\"\"\""));
181181
}
182+
183+
[Test]
184+
public void Can_convert_to_csv_field_from_datetime_respecting_configured_datetimeformat()
185+
{
186+
var dateTime = DateTime.Now;
187+
var testCases = new[] { "yyyy-MM-ddTHH:mm:ss.fff zzzz", "MM/dd/yyyy", "dd/MM/yyyy", "HH:mm:ss", "arbitrary string" };
188+
foreach (var format in testCases)
189+
{
190+
CsvConfig.DateTimeFormatString = format;
191+
Assert.That(dateTime.ToCsvField(),Is.EqualTo("\"" + dateTime.ToString(format) + "\""));
192+
}
193+
}
194+
195+
[Test]
196+
public void Can_convert_to_csv_field_from_nullabledatetime_respecting_configured_datetimeformat()
197+
{
198+
DateTime? dateTime = DateTime.Now;
199+
var testCases = new[] { "yyyy-MM-ddTHH:mm:ss.fff zzzz", "MM/dd/yyyy", "dd/MM/yyyy", "HH:mm:ss", "arbitrary string" };
200+
foreach (var format in testCases)
201+
{
202+
CsvConfig.DateTimeFormatString = format;
203+
Assert.That(dateTime.ToCsvField(), Is.EqualTo("\"" + dateTime.Value.ToString(format) + "\""));
204+
}
205+
DateTime? nullDateTime = null;
206+
Assert.That(nullDateTime.ToCsvField(), Is.EqualTo(null));
207+
}
208+
209+
[Test]
210+
public void Can_convert_to_csv_field_from_datetime_without_a_configured_datetimeformat()
211+
{
212+
CsvConfig.Reset();
213+
Assert.That(DateTime.Now.ToCsvField(), Is.EqualTo("\"" + DateTime.Now + "\""));
214+
}
182215

183216
[Test]
184217
public void Can_convert_to_csv_field_pipe_separator()

0 commit comments

Comments
 (0)