DateTime 객체가 주어지면 ISO 8601 날짜를 문자열 형식으로 어떻게 얻습니까?


789

주어진:

DateTime.UtcNow

ISO 8601 호환 형식으로 동일한 값을 나타내는 문자열을 어떻게 얻 습니까?

ISO 8601은 여러 유사한 형식을 정의합니다. 내가 찾고있는 특정 형식은 다음과 같습니다.

yyyy-MM-ddTHH:mm:ssZ

답변:


780

독자에 대한 참고 사항 : 여러 의견 제시 자들이이 답변에서 일부 문제를 지적했습니다 (특히 첫 번째 제안과 관련됨). 자세한 내용은 주석 섹션을 참조하십시오.

DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");

이렇게하면 2008-09-22T13 : 57 : 31.2311892-04 : 00 와 비슷한 날짜가 제공 됩니다. 됩니다.

다른 방법은 다음과 같습니다.

DateTime.UtcNow.ToString("o");

너에게주는 2008-09-22T14 : 01 : 54.9571247Z를줍니다

지정된 형식을 얻으려면 다음을 사용할 수 있습니다.

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")

날짜 / 시간 형식 옵션


20
요즘에는 오프셋을 사용하여 UTC 시간을 렌더링하려고 시도하면 예외가 발생합니다. 따라서 나는 불변 문화를 가진 "s"형식이 아마도 더 정확하다는 것을 다른 사람들에게 동의합니다. 참고로 formatexception의 메시지는 다음과 같습니다. "UTC DateTime은 현지 시간에만 올바른 형식으로 텍스트로 변환되고 있습니다. 현지 시간대 오프셋을 포함하는 'z'형식 지정자를 사용하여 DateTime.ToString을 호출 할 때 발생할 수 있습니다. 출력에서. "
Tom Lianza

9
나는 호주에 살고 있으며 나를 ToString("yyyy-MM-ddTHH:mm:ssK")위해 이것을 사용 하기 위해 사용해야 했습니다 (jquery timeago 플러그인 사용).
GONeale

6
시간대 오프셋을 포함 시키려면 다음과 같이하십시오 : dt.ToString("s") + dt.ToString("zzz")// 2013-12-05T07 : 19 : 04-08 : 00
alekop

4
슬래시 (\ :)는 문자열에 문제를 일으 킵니다. 대신 @ 문자를 넣어 문자열 리터럴을 사용하십시오.
Gigi

6
@core : 표준 형식 중 하나입니다.이 형식은 연결된 사용자 지정 형식과 다릅니다. msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx
Wayne

361

DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)"s"형식 지정자가 정렬 가능한 날짜 / 시간 패턴으로 설명되어 있으므로 원하는 것을 제공해야합니다. ISO 8601을 준수합니다.


34
나는 이것이 정답이라고 믿는다. Microsoft가 이미 ISO 8601을 구현 한 경우 yyyy-MM-etc를 명시 적으로 정의 할 필요는 없습니다. Iain의 응답도 옳았지만 여러 가지 이유로 항상 InvariantCulture (또는 다른 CultureInfo)를 지정해야합니다. 그냥 가정). 당신은 또한 사용할 수 있습니다 : DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern); 그러나 이러한 모든 시간대 등을 제외하기 때문에 명시 적 포맷터를 사용하는 것 외에는 선택의 여지가 없습니다."yyyy-MM-ddTHH:mm:ss.fffZ"
Jon Davis

20
준수하는 동안 시간대는 Z다음 DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36과 같이 표시 되지 않습니다. 컴퓨터가 초당 상당한 수의 틱을 수행하므로 매우 좋은 밀리 초 해상도는 없습니다.
Henrik

9
으로 o당신이 얻을 2012-06-26T11:55:36.1007668Z의미 36.1007668초, 그래서 당신은 아래 해상도를 얻을 1/10^7초. ISO8601 : 2004부터If a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
Henrik


2
@ binki-지금은 매우 혼란 스럽습니다. SortableDateTimePattern대해 이전에 링크 한 문서 에 따르면 문화에 따라 달라져야 한다고 말합니다. 그러나, 그것은 그들의 예에 의해 모순되는 것처럼 보입니다 (모두 동일하게 보이기 때문에). 시도하십시오 DateTime.Now.ToString("s", new CultureInfo(myCulture)).
drzaus

87
DateTime.UtcNow.ToString("s")

2008-04-10T06 : 30 : 00과 같은 것을 반환합니다.

UtcNow분명히 UTC 시간을 반환 하므로 아무런 해를 끼치 지 않습니다.

string.Concat(DateTime.UtcNow.ToString("s"), "Z")

11
그냥 관심 : 왜 '+'가 아닌 string.Concat ()?
Daniel Fortunov

2
Habbit, 차이가 있습니까?
Iain

84
@ KoenZomers : 나는 그것이 맞지 않다고 생각합니다. 필자 a + bstring.Concat(a, b)(a와 b가 물론 문자열이라고 가정) 과 동일한 중간 코드로 컴파일 하므로 성능이나 메모리 소비에 차이가 없다고 생각합니다.
Mark Byers

78
예, 마크가 맞습니다. Koen, 당신은 정확하더라도 터무니없이 미시적 최적화의 함정에 빠졌습니다.
Noldorin

7
@ greg84 : 글쎄, 당신은 전적으로 옳지 않습니다. 마이크로 소프트 건축가 리코 마리아니에 의해이 게시물을 봐 : blogs.msdn.com/b/ricom/archive/2003/12/15/43628.aspx - 그가 + B는 CONCAT에 컴파일이의 적절한 사용에 대한 몇 가지 자세한 내용은 거기에 + 않습니다 말한다 StringBuilder.
mrówa

37

사용하다:

private void TimeFormats()
{
    DateTime localTime = DateTime.Now;
    DateTime utcTime = DateTime.UtcNow;
    DateTimeOffset localTimeAndOffset = new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));

    //UTC
    string strUtcTime_o = utcTime.ToString("o");
    string strUtcTime_s = utcTime.ToString("s");
    string strUtcTime_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Local
    string strLocalTimeAndOffset_o = localTimeAndOffset.ToString("o");
    string strLocalTimeAndOffset_s = localTimeAndOffset.ToString("s");
    string strLocalTimeAndOffset_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");

    //Output
    Response.Write("<br/>UTC<br/>");
    Response.Write("strUtcTime_o: " + strUtcTime_o + "<br/>");
    Response.Write("strUtcTime_s: " + strUtcTime_s + "<br/>");
    Response.Write("strUtcTime_custom: " + strUtcTime_custom + "<br/>");

    Response.Write("<br/>Local Time<br/>");
    Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "<br/>");
    Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "<br/>");
    Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "<br/>");

}

산출

UTC
    strUtcTime_o: 2012-09-17T22:02:51.4021600Z
    strUtcTime_s: 2012-09-17T22:02:51
    strUtcTime_custom: 2012-09-17T22:02:51Z

Local Time
    strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
    strLocalTimeAndOffset_s: 2012-09-17T15:02:51
    strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z

출처 :


2
당신은 지역 관습에서 복사의 희생자 인 것 같습니다 ;-) string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");결과는 다음과 같습니다.strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
Holly

oISO-8601 형식입니다.
Yousha Aleayoub

33
System.DateTime.UtcNow.ToString("o")

=>

val it : string = "2013-10-13T13:03:50.2950037Z"

이것은 모든 시간대에 걸쳐 명백한 날짜 / 시간이 있다는 것을 확실히 확신 할 수있는 유일한 방법입니다
Matt Wilko

23

다음 코드로 "Z"( ISO 8601 UTC )를 얻을 수 있습니다 .

Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z


이유는 다음과 같습니다.

ISO 8601의 형식은 다음과 같습니다.

DateTimeKind.Local

2009-06-15T13:45:30.0000000-07:00

DateTimeKind.Utc

2009-06-15T13:45:30.0000000Z

DateTimeKind. 지정되지 않음

2009-06-15T13:45:30.0000000


.NET은 다음과 같은 옵션이 포함 된 열거 형을 제공합니다.

'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")

'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")

'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")

참고 : Visual Studio 2008 "watch utility"를 toString ( "o")에 적용하는 경우 부분에 적용하면 다른 결과를 얻을 수 있지만 이것이 버그인지는 모르지만이 경우 String 변수를 사용하여 더 나은 결과를 얻을 수 있습니다 디버깅하는 경우.

출처 : 표준 날짜 및 시간 형식 문자열 (MSDN)


20

DateTime을 ISO 8601로 사용해야하는 경우 ToString ( "o")은 원하는 것을 산출해야합니다. 예를 들어

2015-07-06T12:08:27

그러나 DateTime + TimeZone은 블로그 게시물 .NET의 DateTime 및 DateTimeOffset 블로그에 설명 된대로 다른 문제가 발생할 수 있습니다 . 모범 사례 및 일반적인 함정 :

DateTime에는 코드 버그를 제공하도록 설계된 수많은 트랩이 있습니다.

DateTimeKind.Unspecified를 사용하는 DateTime 값은 나쁜 소식입니다.

DateTime은 비교를 할 때 UTC / Local에 신경 쓰지 않습니다.

DateTime 값은 표준 형식 문자열을 인식하지 못합니다.

DateTime으로 UTC 마커가있는 문자열을 구문 분석해도 UTC 시간이 보장되지는 않습니다.


2
스트라 바에는 ISO8601이 사용됩니다. 그러나 밀리 초 등을 추가하는 ToString ( "o") 대신 다음과 같이 StartTime.ToString ( "yyyy-MM-ddTHH : mm : ssZ")을 사용하십시오.
peterincumbria

2
나를 위해, "yyyy-MM-dd-THH : mm : ssZ"는 시간대 표시 자 대신 문자열 끝에 "Z"를 문자 그대로 출력했습니다. ToString ( "o") 실제로 필요한 작업을 훨씬 쉽고 짧게 수행했습니다.
블레어 코놀리

18

아무도 제안하지 않은 것에 놀랐습니다.

System.DateTime.UtcNow.ToString("u").Replace(' ','T')
# Using PowerShell Core to demo

# Lowercase "u" format
[System.DateTime]::UtcNow.ToString("u")
> 2020-02-06 01:00:32Z

# Lowercase "u" format with replacement
[System.DateTime]::UtcNow.ToString("u").Replace(' ','T')
> 2020-02-06T01:00:32Z

UniversalSortableDateTimePattern은 (더 인 당신이 원하는 당신에게 거의 모든 방법을 얻을 수 RFC 3339 표현).


추가 : 나는 https://stackoverflow.com/a/43793679/653058 에있는 벤치 마크를 사용하기로 결정했습니다. 이것이 어떻게 수행되는지 비교 .

tl : dr; 그것은 비싸지 만 여전히 엉뚱한 오래된 노트북에서 단지 반 밀리 초 이상입니다 :-)

이행:

[Benchmark]
public string ReplaceU()
{
   var text = dateTime.ToUniversalTime().ToString("u").Replace(' ', 'T');
   return text;
}

결과 :

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.19002
Intel Xeon CPU E3-1245 v3 3.40GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
  [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT


|               Method |     Mean |     Error |    StdDev |
|--------------------- |---------:|----------:|----------:|
|           CustomDev1 | 562.4 ns | 11.135 ns | 10.936 ns |
|           CustomDev2 | 525.3 ns |  3.322 ns |  3.107 ns |
|     CustomDev2WithMS | 609.9 ns |  9.427 ns |  8.356 ns |
|              FormatO | 356.6 ns |  6.008 ns |  5.620 ns |
|              FormatS | 589.3 ns |  7.012 ns |  6.216 ns |
|       FormatS_Verify | 599.8 ns | 12.054 ns | 11.275 ns |
|        CustomFormatK | 549.3 ns |  4.911 ns |  4.594 ns |
| CustomFormatK_Verify | 539.9 ns |  2.917 ns |  2.436 ns |
|             ReplaceU | 615.5 ns | 12.313 ns | 11.517 ns |

// * Hints *
Outliers
  BenchmarkDateTimeFormat.CustomDev2WithMS: Default     -> 1 outlier  was  removed (668.16 ns)
  BenchmarkDateTimeFormat.FormatS: Default              -> 1 outlier  was  removed (621.28 ns)
  BenchmarkDateTimeFormat.CustomFormatK: Default        -> 1 outlier  was  detected (542.55 ns)
  BenchmarkDateTimeFormat.CustomFormatK_Verify: Default -> 2 outliers were removed (557.07 ns, 560.95 ns)

// * Legends *
  Mean   : Arithmetic mean of all measurements
  Error  : Half of 99.9% confidence interval
  StdDev : Standard deviation of all measurements
  1 ns   : 1 Nanosecond (0.000000001 sec)

// ***** BenchmarkRunner: End *****

1
허용되는 "o"의 대답은 효과가 있지만 성가신 정도의 정밀도 (geez .XXXXXXX 초)를 제공하지만 초에 멈추기 때문에 이것을 선호합니다.
jhocking 2016

또한 그 의사는 "u"가 ISO 8601이라고 주장하지만 T 대신 공백은 무엇입니까? 함께
만나기

@jhocking en.wikipedia.org/wiki/ISO_8601#cite_note-30 ISO 8601은 당신이 그것을 읽는다면 비교적 관대합니다 ...
rburte

16

나는 단지 다음을 사용할 것이다 XmlConvert:

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);

시간대를 자동으로 유지합니다.


계속해서 확장 방법을 추가했습니다. 공개 정적 클래스 DateTimeExtensions {공개 정적 문자열 ToIsoFormat (this DateTime dateTime) {return XmlConvert.ToString (dateTime, XmlDateTimeSerializationMode.RoundtripKind); }}
muruge

14

이러한 답변의 대부분은 밀리 초 / 마이크로 초로 ISO 8601에서 지원되지 않습니다. 정답은 다음과 같습니다.

System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");

참고 문헌 :


15
"시간"에서 자신의 Wikipedia 링크를 읽으십시오. ISO 10601은 밀리 초와 마이크로 초를 모두 지원함을 의미하는 "소수 소수"를 언급합니다 (그러나 통신 당사자는 소수 자릿수를 허용 할 수 있음).
Søren Boisen

11
DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");

DateTime.Now.ToString("O");

참고 : 마지막에 수행중인 변환에 따라 첫 번째 줄 (가장 비슷 함) 또는 두 번째 줄을 사용하게됩니다.

"zzz"는 UTC 변환의 시간대 정보이므로 현지 시간에만 형식을 적용하십시오.

영상


#ChrisHynes는 코드의 첫 번째 줄에 관해 제안한 것을 묻고 있기 때문에 잘 모르겠습니다. 그러나 당신이 맞다면 그 대답은 "ReSharper"
PSM

9

"s"표준 형식 지정자에 의해 정의 된 사용자 지정 날짜 및 시간 형식 문자열을 나타냅니다 DateTimeFormatInfo.SortableDateTimePattern 속성을. 패턴은 정의 된 표준 ( ISO 8601 )을 반영하며 특성은 읽기 전용입니다. 따라서 사용 된 문화권이나 제공된 형식 공급자에 관계없이 항상 동일합니다. 맞춤 형식 문자열은 "yyyy'-'MM'-'dd'T'HH':'mm':'ss"입니다.

이 표준 형식 지정자를 사용하면 형식 지정 또는 구문 분석 작업은 항상 고정 문화권을 사용합니다.

MSDN에서


1
그래서 사용해도 괜찮 .ToString("s")습니까?
AhmetB-Google 2012 년

나는 그렇게 믿는다. -귀하의 요구 사항이 원래의 질문과 일치하는 한 .. 아래 Simon Simon Wilson의 경고를 살펴보십시오
Amal

9

DateTime.UtcNow를 yyyy-MM-ddTHH : mm : ssZ 의 문자열 표현으로 변환하려면 사용자 정의 형식화 문자열과 함께 DateTime 구조의 ToString () 메소드를 사용할 수 있습니다. DateTime과 함께 사용자 지정 형식 문자열을 사용하는 경우 작은 따옴표를 사용하여 구분 기호를 이스케이프해야합니다.

다음은 원하는 문자열 표현을 반환합니다.

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)

9

사용자 지정 형식 "yyyy-MM-ddTHH : mm : ssK"(ms 제외)가 가장 빠른 형식 방법이라는 점이 흥미 롭습니다.

또한 "S"형식이 클래식에서는 느리고 코어에서는 빠릅니다.

물론 숫자는 매우 가깝고 일부 행 사이의 차이는 중요하지 않습니다 (접미사 _Verify가있는 테스트는 접미사가없는 테스트와 동일하며 결과 반복성을 보여줍니다)

BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC
  [Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Clr    : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Core   : .NET Core 4.6.25009.03, 64bit RyuJIT


               Method |  Job | Runtime |       Mean |     Error |    StdDev |     Median |        Min |        Max | Rank |  Gen 0 | Allocated |
--------------------- |----- |-------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----:|-------:|----------:|
           CustomDev1 |  Clr |     Clr | 1,089.0 ns | 22.179 ns | 20.746 ns | 1,079.9 ns | 1,068.9 ns | 1,133.2 ns |    8 | 0.1086 |     424 B |
           CustomDev2 |  Clr |     Clr | 1,032.3 ns | 19.897 ns | 21.289 ns | 1,024.7 ns | 1,000.3 ns | 1,072.0 ns |    7 | 0.1165 |     424 B |
     CustomDev2WithMS |  Clr |     Clr | 1,168.2 ns | 16.543 ns | 15.474 ns | 1,168.5 ns | 1,149.3 ns | 1,189.2 ns |   10 | 0.1625 |     592 B |
              FormatO |  Clr |     Clr | 1,563.7 ns | 31.244 ns | 54.721 ns | 1,532.5 ns | 1,497.8 ns | 1,703.5 ns |   14 | 0.2897 |     976 B |
              FormatS |  Clr |     Clr | 1,243.5 ns | 24.615 ns | 31.130 ns | 1,229.3 ns | 1,200.6 ns | 1,324.2 ns |   13 | 0.2865 |     984 B |
       FormatS_Verify |  Clr |     Clr | 1,217.6 ns | 11.486 ns | 10.744 ns | 1,216.2 ns | 1,205.5 ns | 1,244.3 ns |   12 | 0.2885 |     984 B |
        CustomFormatK |  Clr |     Clr |   912.2 ns | 17.915 ns | 18.398 ns |   916.6 ns |   878.3 ns |   934.1 ns |    4 | 0.0629 |     240 B |
 CustomFormatK_Verify |  Clr |     Clr |   894.0 ns |  3.877 ns |  3.626 ns |   893.8 ns |   885.1 ns |   900.0 ns |    3 | 0.0636 |     240 B |
           CustomDev1 | Core |    Core |   989.1 ns | 12.550 ns | 11.739 ns |   983.8 ns |   976.8 ns | 1,015.5 ns |    6 | 0.1101 |     423 B |
           CustomDev2 | Core |    Core |   964.3 ns | 18.826 ns | 23.809 ns |   954.1 ns |   935.5 ns | 1,015.6 ns |    5 | 0.1267 |     423 B |
     CustomDev2WithMS | Core |    Core | 1,136.0 ns | 21.914 ns | 27.714 ns | 1,138.1 ns | 1,099.9 ns | 1,200.2 ns |    9 | 0.1752 |     590 B |
              FormatO | Core |    Core | 1,201.5 ns | 16.262 ns | 15.211 ns | 1,202.3 ns | 1,178.2 ns | 1,225.5 ns |   11 | 0.0656 |     271 B |
              FormatS | Core |    Core |   993.5 ns | 19.272 ns | 24.372 ns |   999.4 ns |   954.2 ns | 1,029.5 ns |    6 | 0.0633 |     279 B |
       FormatS_Verify | Core |    Core | 1,003.1 ns | 17.577 ns | 16.442 ns | 1,009.2 ns |   976.1 ns | 1,024.3 ns |    6 | 0.0674 |     279 B |
        CustomFormatK | Core |    Core |   878.2 ns | 17.017 ns | 20.898 ns |   877.7 ns |   851.4 ns |   928.1 ns |    2 | 0.0555 |     215 B |
 CustomFormatK_Verify | Core |    Core |   863.6 ns |  3.968 ns |  3.712 ns |   863.0 ns |   858.6 ns |   870.8 ns |    1 | 0.0550 |     215 B |

암호:

    public class BenchmarkDateTimeFormat
    {
        public static DateTime dateTime = DateTime.Now;

        [Benchmark]
        public string CustomDev1()
        {
            var d = dateTime.ToUniversalTime();
            var sb = new StringBuilder(20);

            sb.Append(d.Year).Append("-");
            if (d.Month <= 9)
                sb.Append("0");
            sb.Append(d.Month).Append("-");
            if (d.Day <= 9)
                sb.Append("0");
            sb.Append(d.Day).Append("T");
            if (d.Hour <= 9)
                sb.Append("0");
            sb.Append(d.Hour).Append(":");
            if (d.Minute <= 9)
                sb.Append("0");
            sb.Append(d.Minute).Append(":");
            if (d.Second <= 9)
                sb.Append("0");
            sb.Append(d.Second).Append("Z");
            var text = sb.ToString();
            return text;
        }

        [Benchmark]
        public string CustomDev2()
        {
            var u = dateTime.ToUniversalTime();
            var sb = new StringBuilder(20);
            var y = u.Year;
            var d = u.Day;
            var M = u.Month;
            var h = u.Hour;
            var m = u.Minute;
            var s = u.Second;
            sb.Append(y).Append("-");
            if (M <= 9)
                sb.Append("0");
            sb.Append(M).Append("-");
            if (d <= 9)
                sb.Append("0");
            sb.Append(d).Append("T");
            if (h <= 9)
                sb.Append("0");
            sb.Append(h).Append(":");
            if (m <= 9)
                sb.Append("0");
            sb.Append(m).Append(":");
            if (s <= 9)
                sb.Append("0");
            sb.Append(s).Append("Z");
            var text = sb.ToString();
            return text;
        }

        [Benchmark]
        public string CustomDev2WithMS()
        {
            var u  = dateTime.ToUniversalTime();
            var sb = new StringBuilder(23);
            var y  = u.Year;
            var d  = u.Day;
            var M  = u.Month;
            var h  = u.Hour;
            var m  = u.Minute;
            var s  = u.Second;
            var ms = u.Millisecond;
            sb.Append(y).Append("-");
            if (M <= 9)
                sb.Append("0");
            sb.Append(M).Append("-");
            if (d <= 9)
                sb.Append("0");
            sb.Append(d).Append("T");
            if (h <= 9)
                sb.Append("0");
            sb.Append(h).Append(":");
            if (m <= 9)
                sb.Append("0");
            sb.Append(m).Append(":");
            if (s <= 9)
                sb.Append("0");
            sb.Append(s).Append(".");
            sb.Append(ms).Append("Z");
            var text = sb.ToString();
            return text;
        }
        [Benchmark]
        public string FormatO()
        {
            var text = dateTime.ToUniversalTime().ToString("o");
            return text;
        }
        [Benchmark]
        public string FormatS()
        {
            var text = string.Concat(dateTime.ToUniversalTime().ToString("s"),"Z");
            return text;
        }

        [Benchmark]
        public string FormatS_Verify()
        {
            var text = string.Concat(dateTime.ToUniversalTime().ToString("s"), "Z");
            return text;
        }

        [Benchmark]
        public string CustomFormatK()
        {
            var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
            return text;
        }

        [Benchmark]
        public string CustomFormatK_Verify()
        {
            var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
            return text;
        }
    }

https://github.com/dotnet/BenchmarkDotNet 이 사용되었습니다



2

SharePoint 2010 이상 에서 개발중인 경우

using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)

20
.Net이 Java가 아닌 경우 SharePoint.
Henrik

18
이를 위해 SharePoint를 사용하는 것은 젤리 통, 젖은 성냥 상자 및 공중 그네를 걷는 침팬지 2 마리를 총 싸움에 가져 오는 것과 같습니다.
nathanchere

SharePoint에서도 BCL .ToString("o")또는 더 나은을 사용할 수 있기를 바랍니다 $"My complicated string {dt:o}".
binki

2

2018-06-22T13 : 04 : 16 과 같은 형식으로 API의 URI로 전달할 수 있습니다.

public static string FormatDateTime(DateTime dateTime)
{
    return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
}

1
이 ISO 날짜 문자열은 정의마다 문화가 변하지 않는다고 생각합니다.
조나스

1

다른 답변에서 언급했듯이 DateTime디자인에 문제가 있습니다.

노다 타임

날짜 / 시간 값을 관리 하기 위해 NodaTime 을 사용하는 것이 좋습니다 .

  • 현지 시간, 날짜, 날짜 / 시간
  • 세계 시간
  • 시간대가있는 시간
  • 기간
  • 지속

서식

따라서 작성하고 형식화 ZonedDateTime하려면 다음 코드 스 니펫을 사용할 수 있습니다.

var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);

var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T10:15:22Z


var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));

var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T12:15:22Z

나를 위해 NodaTime코드는 매우 장황하게 보입니다. 그러나 유형은 정말 유용합니다. 날짜 / 시간 값을 올바르게 처리하는 데 도움이됩니다.

Newtonsoft.Json

NodaTime함께 사용하려면 NuGet 패키지 Newtonsoft.Json에 대한 참조를 추가 NodaTime.Serialization.JsonNet하고 JSON 옵션을 구성 해야합니다 .

services
    .AddMvc()
    .AddJsonOptions(options =>
    {
        var settings=options.SerializerSettings;
        settings.DateParseHandling = DateParseHandling.None;
        settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.