[C#] DateTime.ToString (“MM / dd / yyyy HH : mm : ss.fff”)은“09/14/2013 07.20.31.371”과 같은 결과를 가져 왔습니다

현재 시간을 웹 서비스에 보내는 WP8 앱이 있습니다.

전화로 날짜 시간 문자열을 얻습니다.

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

대부분의 사용자에게는 훌륭하게 작동하며 다음과 같은 올바른 문자열을 제공합니다 "09/10/2013 04:04:31.415". 그러나 일부 사용자에게는 결과 문자열이와 같 "09/14/2013 07.20.31.371"으며 웹 서비스에 문제가 발생합니다.

문화 형식에 문제가 있습니까? 결과 문자열이 점 대신 콜론으로 구분되도록하려면 어떻게해야합니까?



답변

문화 형식에 문제가 있습니까?

예. 사용자는 시간 구분 기호가 도트 인 문화권에 있어야합니다. “:”및 “/”는 모두 사용자 정의 날짜 및 시간 형식 으로 문화권에 따라 해석 됩니다 .

결과 문자열이 점 대신 콜론으로 구분되도록하려면 어떻게해야합니까?

다음을 지정하는 것이 좋습니다 CultureInfo.InvariantCulture.

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

또는 시간 및 날짜 구분 기호를 인용 할 수도 있습니다.

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

…하지만 기본 캘린더 시스템이 Gregorian 캘린더가 아닌 문화권에서 사용자를 실행하는 경우 예상치 못한 “흥미로운”결과를 얻을 수 있습니다. 예를 들어 다음 코드를 사용하십시오.

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()
    {
        DateTime now = DateTime.Now;
        CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
    }
} 

다음과 같은 결과 (2013 년 9 월 18 일)를 생성합니다.

11/12/1434 15:04:31.750

내 생각 엔 귀하의 웹 서비스가 놀랍습니다!

실제로 불변 문화를 사용하는 것뿐만 아니라 ISO-8601 날짜 형식으로 변경하는 것이 좋습니다 .

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

이것은 전 세계적으로 허용되는 형식입니다. 정렬 가능하며 월과 일 순서가 분명합니다. (2013 년 6 월 7 일 또는 7 월 6 일은 독자의 문화에 따라 해석 될 수 있습니다.)


답변

:특별한 의미가 있습니다 . 시간 구분 기호입니다. ( 사용자 정의 날짜 및 시간 형식 문자열 ).

\그것을 피하기 위해 사용 :

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

또는 사용 CultureInfo.InvariantCulture:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

두 번째 것과 함께하는 것이 좋습니다. /특별한 의미가 있기 때문에 ( 날짜 구분 기호입니다. ) 따라서 문제가 발생할 수 있습니다.


답변

사용자는 콜론 대신 점을 사용하는 문화권에 있어야하므로 InvariantCulture를 사용할 수 있습니다.

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);


답변

나는 최근에 다른 방향 에서 Windows 10 으로이 문제에 부딪 쳤고 @JonSkeet의 대답이 내 문제를 해결하는 데 매우 도움이된다는 것을 알았습니다.

또한 테스트 양식을 사용하여 추가 조사를 한 결과 현재 문화권이 런타임 ( ) 으로 설정 "no"되거나 "nb-NO"런타임 ( Thread.CurrentThread.CurrentCulture = new CultureInfo("no");) 으로 설정되면 Windows 7에서 ToString ( “yyyy-MM-dd HH : mm : ss”) 호출이 다르게 응답합니다. Windows 10. Windows 7에서 예상 한 것과 Windows 10에서 HH.mm.ss를 반환했습니다!

나는 이것이 약간 무섭다고 생각한다! 문화는 모든 Windows 버전의 문화라고 생각했기 때문에.


답변

String.Format을 사용할 수 있습니다.

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"


답변

날짜를 문자열로 변환

네임 스페이스 사용

using System.Globalization;

암호

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");


답변