DateTime: C# => JSON
JSON Date and DateTime serialisation in c# & newtonsoft
We are sending JSON to an API defined by swagger that some properties are DateTime in the format yyyy-MM-ddThh:mm:ss.000Z (the milliseconds must be 3 digits or it fails validation at the endpoint) ...
stackoverflow.com
다음을 시도해 볼 수 있습니다.
DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
DateTime: C# => SQL
아래에서 이것을 시도해보세요
DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
업데이트 - 2024
현재 ISO8601은 RFC 7493에 정의된 JSON에서 날짜를 지정하는 실제 표준 방법입니다.
이러한 모든 데이터 항목은 RFC3339에 지정된 대로 ISO 8601 형식의 문자열 값으로 표현하는 것이 권장되며, 소문자 대신 대문자를 사용하고 시간대를 기본값으로 포함하지 않으며 선택적 후행 초를 포함하는 추가 제한 사항이 있습니다. 값이 "00"인 경우에도 포함됩니다.
RFC3399는 소수 초가 선택 사항임을 지정합니다. 시간대는 RFC3399에서도 선택 사항이지만 RFC7492에 따라 JSON에서는 필수입니다.
time-fraction = ("," / ".") 1*DIGIT
time-numoffset = ("+" / "-") time-hour [[":"] time-minute]
time-zone = "Z" / time-numoffset
...
time = timespec-base [time-fraction] [time-zone]
.NET 6에는 현재 ASP.NET Core, System.Text.Json 및 EF Core에서 지원되는 DateOny 및 TimeOnly가 도입되었습니다.
이 스니펫은 다음과 같습니다.
record Test(DateOnly date,TimeOnly time);
...
var test=new Test(new DateOnly(2024,10,19),new TimeOnly(21,34))
var json=JsonSerializer.Serialize(text);
생산하다
{"date":"2024-10-19","time":"21:34:00"}
JSON.NET의 JsonConvert.SerializeObject(test);은 동일한 문자열을 생성합니다.
원래 답변
댓글에서 언급했듯이 JSON에는 표준 날짜 표현이 없습니다. ISO8601은 사실상의 표준입니다. 즉, 대부분의 사람들이 몇 년 전에 이것을 사용하기 시작했습니다. ISO8601에는 밀리초가 필요하지 않습니다. 다른 끝점에서 요구하는 경우 사실상의 표준을 위반하는 것입니다.
Json.NET은 버전 4.5부터 IOS8601을 사용해 왔습니다. 현재 버전은 10.0.3입니다. 다음 코드:
JsonConvert.SerializeObject(DateTime.Now)
보고
"2017-09-08T19:01:55.714942+03:00"
내 컴퓨터에서. 시간대 오프셋을 확인하세요. 그것도 표준의 일부입니다. Z은 UTC를 의미합니다.
올바른 시간 형식이라면 자신만의 시간 형식을 지정할 수 있습니다. 이 경우 yyyy-MM-ddTHH:mm:ss.fffZ 이어야 합니다. 밀리초는 fff이고 24시간은 HH입니다.
다음 코드
var settings = new JsonSerializerSettings {
DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ"
};
var json = JsonConvert.SerializeObject(DateTime.Now, settings);
보고
"2017-09-08T19:04:14.480Z"
형식 문자열은 시간대 변환을 강제하지 않습니다. DateTimeZoneHandling 설정을 통해 Json.NET에 시간을 Local 또는 Utc로 처리하도록 지시할 수 있습니다.
var settings = new JsonSerializerSettings {
DateFormatString = "yyyy-MM-ddTH:mm:ss.fffZ",
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
var json = JsonConvert.SerializeObject(DateTime.Now, settings);
반품 :
"2017-09-08T16:08:19.290Z"
업데이트
Matt Johnson이 설명했듯이 Z은 리터럴인 반면 K은 DateTimeZoneHandling 설정에 따라 Z 또는 오프셋을 생성합니다.
DateTimeZoneHandling.Utc이 포함된 형식 문자열 yyyy-MM-ddTH:mm:ss.fffK:
var settings = new JsonSerializerSettings {
DateFormatString ="yyyy-MM-ddTH:mm:ss.fffK",
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
var json = JsonConvert.SerializeObject(DateTime.Now, settings);
반환됩니다:
2017-09-11T9:10:08.293Z
DateTimeZoneHandling.Local으로 변경하면 반환됩니다.
2017-09-11T12:15:12.862+03:00
그건 그렇고, 이는 강제된 밀리초 정밀도를 제외하고 Json.NET의 기본 동작입니다.
마지막으로 .NET에는 아직 Date 전용 유형이 없습니다. DateTime은 날짜와 날짜+시간 값 모두에 사용됩니다. DateTime.Date 속성을 사용하여 DateTime의 날짜 부분을 가져올 수 있습니다. DateTime.Today 를 사용하여 현재 날짜를 검색할 수 있습니다.
시간은 TimeSpan 유형으로 표시됩니다. DateTime.TimeOfDay 를 사용하여 DateTime 값에서 시간을 추출할 수 있습니다. Timespan는 24시간 이상을 나타낼 수 있으므로 엄밀히 말하면 시간 유형이 아닙니다.
그건 또 뭐였지?
명시적 날짜에 대한 지원인 TimeOfDay은 CoreFX Lab 프로젝트를 통해 제공됩니다. 여기에는 UTF8 지원, 날짜, 문자열, 채널과 같이 .NET 런타임에 나타날 가능성이 매우 높은 "실험적" 기능이 포함되어 있습니다. 이들 중 일부는 이미 별도의 NuGet 패키지로 표시됩니다.
코드를 복사하거나 실험적인 NuGet 소스를 통해 추가하여 System.Time 클래스를 이미 사용할 수 있습니다.
'C#' 카테고리의 다른 글
[C#] public 필드 멤버 접근 vs 프로퍼티 멤버 접근 (0) | 2023.05.19 |
---|---|
[C#] .NET 소스 레퍼런스 (0) | 2023.05.18 |
[C#] object를 JSON 형식으로 바꾸기 (0) | 2023.05.11 |
[C#] Convert DataSet to List (0) | 2023.05.10 |
[C#] DateTime 출력 (0) | 2023.04.28 |