У меня есть вариант использования, в котором ВСЕ значения даты / времени должны быть сохранены в документах JSON в следующем формате:
yyyy-MM-ddTHH:mm:ss.fffffff
Другими словами, все значения даты / времени будут ровно 27 символов вдлина независимо от значения даты / времени, например:
System.DateTime.MinValue = "0001-01-01T00:00:00.0000000"
System.DateTime.MaxValue = "9999-12-31T23:59:59.9999999"
19-May-2018 10:35:12 am = "2018-05-19T10:35:12.0000000"
К сожалению, Json.Net принимает решение отформатировать дату / время в различных форматах в зависимости от значения даты / времени.Я попытался использовать атрибут JsonConverter для свойств даты / времени, а именно:
[JsonConverter( typeof( datetime_iso8601_converter ) )]
public System.DateTime created_utc;
Мой класс преобразователя выглядит следующим образом:
public class datetime_iso8601_converter : Newtonsoft.Json.Converters.IsoDateTimeConverter
{
public datetime_iso8601_converter()
{
// Set format that all DateTime values will use ...
base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffff";
}
}
Если я запускаю тест с использованием отладчика,например:
created_utc = System.DateTime.MinValue;
Я вижу, что следующая строка выполнена:
base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffff";
Однако полученное записанное значение даты / времени JSON:
"0001-01-01T00:00:00"
ВТОРАЯ ПОПЫТКА:
Я попробовал следующий конвертер ...
public class datetime_iso8601_converter : Newtonsoft.Json.Converters.DateTimeConverterBase
{
// The format that all datetime values will use ...
private const String k_fmt_datetime_iso8601 = "yyyy-MM-ddTHH:mm:ss.fffffff";
// Write the given datetime value using the format above ...
public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
{
if ( value is System.DateTime )
{
String dt_str;
System.DateTime dt;
dt = ( System.DateTime ) value;
dt_str = dt.ToString( k_fmt_datetime_iso8601 );
writer.WriteRawValue( dt_str );
}
else
{
throw new ArgumentException( "value is not System.DateTime" );
}
}
// Return a datetime value ...
public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
{
if ( reader.TokenType != Newtonsoft.Json.JsonToken.Date )
{
throw new Exception( "Invalid token. Expected Date" );
}
return reader.Value;
}
}
Снова используя отладчик, я вижу, что dt_str установлено значение:
"0001-01-01T00:00:00.0000000"
, но записываемое значение:
"0001-01-01T00:00:00"
Я не понимаю, почему.
КАК я могу получитьвсе значения даты / времени, сохраненные в требуемом формате?
Заранее спасибо.