본문 바로가기
프로그래밍/C#

[C#] DateTime값 Serialization/Deserialization시 DateTime.Minvalue 수치 변하는 현상.

by 뽀도 2022. 12. 16.

 

문제

 

ServiceStack을 사용하여 object를 json으로 serialization / deserialization 하면서 사용중인데, 

분명히 DataTime.MinValue로 초기화(0001-01-01 00:00:00) 하여 저장한 변수인데,

ToJson() 후 파싱하면 출력되는 값이 0001-01-01 09:00:00 으로 변경 되어 출력되는 문제가 있었다.

 

찾아보니 

"The TimeZone when serializing into a DateFormat that includes the TimeZone is the local timezone of the computer serializing the date. "

"TimeZone을 포함하는 DateFormat으로 직렬화할 때 TimeZone은 날짜를 직렬화하는 컴퓨터의 로컬 시간대입니다

라는 글을 보았다.

 

그래서 여기 저기서 찾아서 최대한 원하는 값을 얻을 수 있게 수정하였다. 

 

해결

 

"JsConfig.DateHandler = DateHandler.ISO8601;"

 

위의 코드를 넣으면 날짜 데이터 저장시 값을 처음 설정한 값으로 넣을 수 있다. 

// membership 객체 만들고 데이터 초기화 
var membership = new Membership();

membership.Name = "송중기";
membership.RegTime = DateTime.MinValue;
SimpleLogManager.Instance.Debug($"데이터 초기화 직후 : {membership.Name}, {membership.RegTime.ToString("yyyy-MM-dd HH:mm:ss")}");

// 객체 serialize (Newton.soft json 사용)
var pJson = JsonConvert.SerializeObject(membership);
SimpleLogManager.Instance.Debug($"object -> Json : {pJson}");
// 객체 deserialize 
var newP = JsonConvert.DeserializeObject<Membership>(pJson);
SimpleLogManager.Instance.Debug($"Json -> object : {newP.Name}, {newP.RegTime.ToString("yyyy-MM-dd HH:mm:ss")}");
// 값 변경되지 않음.. 


SimpleLogManager.Instance.Debug($"");

var pJson2 = membership.ToJson();
SimpleLogManager.Instance.Debug($"object -> Json : {pJson2}");
var newP2 = JsonObject.Parse(pJson2);
// regTime값만 가져옴
var newP2RegTime = newP2.Get<DateTime>("RegTime");
SimpleLogManager.Instance.Debug($"Json -> object.RegTime : {newP2RegTime.ToString("yyyy-MM-dd HH:mm:ss")}");
// 값이 위 아래가 다름 

SimpleLogManager.Instance.Debug($"");

//// 수정용 코드 
JsConfig.DateHandler = DateHandler.ISO8601;

pJson2 = membership.ToJson();
SimpleLogManager.Instance.Debug($"object ->  pjson2 : {pJson2}");
newP2 = JsonObject.Parse(pJson2);
newP2RegTime = newP2.Get<DateTime>("RegTime");
SimpleLogManager.Instance.Debug($"Json -> object.RegTime : {newP2RegTime.ToString("yyyy-MM-dd HH:mm:ss")}");

 

보면 두번째 송중기가 있는 줄은 serialize할 때 값이 변경되었고, 

해결코드 이후부터는 원하는 값을 볼 수 있다.

 

 

 

 

참고)

https://stackoverflow.com/questions/24021235/why-does-servicestack-emit-local-time-even-if-date-was-utc-in-json

 

Why does ServiceStack emit local time even if date was UTC in JSON?

Long story short- a date round tripped through ServiceStack.Text's JSON parser loses time zone information. Oddly enough, DateTimeSerializerTests.DateTime_Is_Serialized_As_Utc_and_Deserialized_as_l...

stackoverflow.com

 

https://forums.servicestack.net/t/strange-datetime-conversion-issues/6701

반응형

댓글