2017-11-06 11 views
2

.NET에서 다음 출력을 만들 수 있습니까?Dateformat ISO 8601을 사용하여 .NET CultureInfo를 만드는 방법은 무엇입니까?

DateTime.UtcNow.ToString() --> "2017-11-07T00:40:00.123456Z" 

은 물론 항상 ToString ("S") 또는 ToString (": mm : ss.fffffffK YYYY-MM ISO 형식")를 사용할 수있는 가능성이있다. 그러나 매개 변수없는 ToString-Method의 기본 동작을 원하는 출력으로 조정할 수있는 방법이 있습니까?

CurrentCulture를 변경해 보았습니다. 하지만 내가 얻은 최선은 "2017-11-07 00 : 40 : 00.123456Z"입니다. 나는 공간에서 "T"까지 날짜와 시간 사이의 분리 기호를 변경하는 방법을 찾지 못했습니다.

답변

4

리플렉션을 통해 내부 필드에 액세스하는 경우에만 가능하지만 모든 경우에 작동하는 것은 아닙니다. 는 ISO 8601 규격 에 공백이 T 대신 사용할 수 있도록 않습니다

var culture = (CultureInfo) CultureInfo.InvariantCulture.Clone(); 
var field = typeof(DateTimeFormatInfo).GetField("generalLongTimePattern", 
              BindingFlags.NonPublic | BindingFlags.Instance); 
if (field != null) 
{ 
    // we found the internal field, set it 
    field.SetValue(culture.DateTimeFormat, "yyyy-MM-dd'T'HH:mm:ss.FFFFFFFK"); 
} 
else 
{ 
    // fallback to setting the separate date and time patterns 
    culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"; 
    culture.DateTimeFormat.LongTimePattern = "HH:mm:ss.FFFFFFFK"; 
} 
CultureInfo.CurrentCulture = culture; 

Console.WriteLine(DateTime.UtcNow); // "2017-11-07T00:53:36.6922843Z" 

참고. T을 사용하는 것은 단지 입니다.이 바람직합니다.

+0

고마워요! 나는 이것을 어쨌든 사용하지 않을 것이기 때문에 이것을 사용하지 않을 것입니다. 누군가가 관심이있는 경우 : 위 필드는 수정되지 않은 datetime 형식의 내부 "캐시"입니다. https://referencesource.microsoft.com/#mscorlib/system/globalization/datetimeformatinfo.cs,a1da93c5a4a8c4e3 – Andreas

+0

그래, 실제로 이렇게하지 않는 것이 좋습니다. 올바른 형식 지정과 함께'ToString'을 사용하십시오. 이런 식으로 숨기는 것이 최선의 방법은 아닐 것입니다. 어쩌면 좋은 해결책이 될지 모르지만 피해야합니다. :) –

0

Scott Hanselmann이 (가) here에 블로그에 올렸습니다.

조금 반사 형은 System.DateTime.ToString ("G")에서와 같이 System.DateTime의 기본 형식 문자열이 "G"임을 보여줍니다. 여기서 G는 사전 설정 중 하나입니다.

[...]

와 "G"는 ShortDate의 조합와 오랜 것을 나타내는, 그가 예상하는 출력을 얻는다.

그래서 당신은 오버라이드 (override) 할 필요가 ShortDatePatternLongTimePattern :

var customCulture = new CultureInfo("en-US") 
{ 
    DateTimeFormat = 
    { 
     ShortDatePattern = "yyyy-MM-dd", 
     LongTimePattern = "HH:mm:ss.FFFFFFFK" 
    } 
}; 

Console.WriteLine(DateTime.Now); 

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture; 
System.Threading.Thread.CurrentThread.CurrentUICulture = customCulture; 
Console.WriteLine(DateTime.Now); 

Console.ReadLine(); 

그러나 스콧라는 제목의 한 자신의 게시물 가 악 활성화 : 나는 C 번호에 코드를 변환 예, 그것은이 작동

이유. 그렇게하기 전에 두 번 생각하십시오!

T은 필요하지 않지만 제공 할 수도 없습니다. 그래도 필요하다면 Reflection을 Matt answered으로 사용해야합니다.