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


131

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

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

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

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

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


2
유일한 차이점은 콜론 대 점입니다.
Eldorado

답변:


244

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

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

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

다음을 지정하는 것이 좋습니다 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 일은 독자의 문화에 따라 해석 될 수 있습니다.)


고마워 존. 결과 문자열이 형식 문자열과 정확히 같을 것이라고 생각했습니다. 나는 당신의 제안을 시도합니다.
Eldorado

3
하나의 작은 고려 사항입니다. 특정 코드에서 CultureInfo 개체를로드 할 때는 항상 useUserOverride매개 변수를 false 로 설정하는 것이 좋습니다 . 그렇지 않으면 일부 사용자 설정이 culture 설정을 재정의 할 수 있습니다. 예를 들어 귀하의 경우 new 사용하는 것이 좋습니다 CultureInfo("ar-SA", false).
Davide Icardi

@DavideIcardi : 흥미롭고 감사합니다.이 경우 사우디 아라비아를 사용하는 목적은 왜 변하지 않는 문화를 사용하는 것이 옳은지에 대한 이유입니다. 그래도 향후 게시물에 대해 명심하십시오.
Jon Skeet

7
이 광범위한 답변의 중간 쯤에 나는 궁금해지기 시작했다. 네.
절망의 그리미

Html.TextBoxFor (x => x.Date, "{0 : MM / dd / yyyy}")로 관리하는 방법은 무엇입니까?
VISHMAY

9

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

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

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

또는 사용 CultureInfo.InvariantCulture:

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

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


2
그것은 날짜 구분자 만이 문제가 아닙니다. 실제 숫자에 영향을 미치는 문화의 예를 보려면 제 답변을보십시오.
Jon Skeet

1
\ 탈출하지 않습니다!
Shereef Marzouk 님이

8

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

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

7

나는 최근에 다른 방향 에서 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 버전의 문화라고 생각했기 때문에.


나는 이것이 실제로 어떤 원인을 찾는 지 궁금합니다.
Lauri Peltonen

2
Windows 10 Locaization Bug로 인식되어 수정되었습니다. 따라서 클라이언트 컴퓨터의 Windows 업데이트로 문제가 해결됩니다. 자세한 내용은이 블로그 게시물에서 확인할 수 있습니다 : heikniemi.net/hardcoded/2015/08/…
Håkon Seljåsen

위에 링크 된 Jouni Heikniemi의 블로그가 손상된 것 같습니다. 문제가 해결 된 관련 Windows 업데이트는 다음과 같습니다. 2015-10-09 : KB3093266 – Windows 10 KB3088956 – Windows Server 2012 R2 및 Windows 8.1 KB3088955 – Windows Server 2012 및 Windows 8 KB3088957 – Windows 7 SP1, Windows Server 2008 SP2 윈도우 서버 2008 R2 SP1 및 Windows Vista SP2는, 다시 블로그에 링크를 이번에 생각을 시도 archive.org : web.archive.org/web/20161030193739/http://www.heikniemi.net/...
HAKON Seljåsen

4

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"

0

날짜를 문자열로 변환

네임 스페이스 사용

using System.Globalization;

암호

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

이것은 날짜를 문자열로 변환하는 방법이 아닙니다. 파싱이 반대입니다!
Vincent Vancalbergh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.