2013-11-04 4 views
4

문자열을 텍스트 파일에서 DateTime으로 변환하려고하는데 이상한 결과가 나타납니다. 한 컴퓨터에서는 작동하지만 다른 컴퓨터에서는 작동하지 않습니다. 이 컴퓨터를 모든 컴퓨터에서 어떻게 만들 수 있습니까? 마지막 질문에, 당신은 문화를 추가하라는 말을했고, 그것은 몇 분 동안 작동했지만, 지금은 다시 작동하지 않습니다. Heres는 내 코드 :문자열을 DateTime으로 변환하지 못했습니다.

string[] stringArray = File.ReadAllLines("C:\\Program Files\\PointOfSales\\RecordTotals.txt"); 
      int lines = stringArray.Length; 

      for (int i = 0; i < (lines/5); i++) 
      { 
       TransactionList.Add(new Transaction 
       { 
        TotalEarned = Convert.ToDouble(stringArray[(i * 5)]), 
        TotalCost = Convert.ToDouble(stringArray[(i * 5) + 1]), 
        TotalHST = Convert.ToDouble(stringArray[(i * 5) + 2]), 
        Category = stringArray[(i * 5) + 3], 
        HoursSince2013 = Convert.ToDateTime(stringArray[(i * 5) + 4], CultureInfo.InvariantCulture) 
       }); 
      } 

내가 String was not recognized as a valid DateTime.

모든 단서가 뭐죠 오류를 받고 있어요? 감사!

편집 : 26/10/2013 11:58:03 AM

편집을 얻을 MessageBox.Show(stringArray[(i * 5) + 4]); 사용 : 왜이 ​​작품은 바로 문화에 현재 시간을 변환하지 않습니다?

DateTime Today = DateTime.Now; 
      Today = DateTime.ParseExact(Today.ToString(), "dd/MM/yyyy HH:mm:ss tt", CultureInfo.InvariantCulture); 
+1

실패한 문자열을 게시 할 수 있습니까? 이 모든 것이 끝까지 잘 어울립니다. –

+0

파일이 항상 같은가요? –

+0

프로그램을 디버깅 할 때 정확히'stringArray [(i * 5) + 4] 값은 무엇입니까? –

답변

1

귀하의 문자열은 해당 시스템에 고정 문화권의 올바른 날짜되지 않습니다 : 26/10/2013 11:58:03 AM. 불변 문화는 일/월/년이 아닌 월/일/년을 예상합니다.

읽고있는 파일을 생성하는 데 사용되는 문화권과 동일한 문화권을 지정해야합니다. 파일을 읽는 것뿐만 아니라 파일에 쓰는 데 사용되는 문화권을 결정하거나 표준화 할 수있는 방법이 필요합니다.


편집 : 왜이 ​​작품이 바로 문화에 현재 시간을 변환하지 않습니다?

현재 문화권에서 해당 형식에 대해 dd/MM/yyyy을 사용하지 않으면 오류가 발생합니다. Today.ToString()에는 지정된 문화권이나 형식이 없으므로 미국 시스템에서 MM/dd/yyyy 형식을 사용하여 기록하므로 통화가 실패합니다. 귀하의 경우에는

, 난 항상 읽고 같은 문화를 사용하여 작성하는 것이 좋습니다 - 당신이 사용하여 파일을 작성하는 경우 : theDate.ToString(CultureInfo.InvariantCulture)을, 당신은 Convert.ToDateTime(theString, CultureInfo.InvariantCulture)를 사용하여 읽을 수 있고, 같은 규칙 때문에, 모든 시스템에서 작동합니다 (불변 문화)는 글쓰기와 읽기 모두에 사용됩니다.

+0

날짜 형식을 변경하면이 코드가 모든 컴퓨터에서 작동합니까? – Nathan

+0

@Nathan Yes - 항상 'InvariantCulture'를 사용하여 날짜를 쓰는 경우, 항상 같은 방법으로 읽을 수 있습니다. –

+0

또는 간단히'DateTime.TryParseExact'를 사용해보십시오. –

0

사용자 정의 "dd/MM/yyyy HH:mm:ss t" 형식을 InvariantCulture과 같이 사용해야합니다.

string s = "26/10/2013 11:58:03 AM"; 
DateTime dt = DateTime.ParseExact(s, "dd/MM/yyyy HH:mm:ss tt", CultureInfo.InvariantCulture); 
Console.WriteLine(dt); 

출력됩니다. 여기에 demonstration

10/26/2013 11:58:03 AM 

.

자세한 내용은 다음을 참조하십시오.

편집 : 당신의 DateTime.Now"dd/MM/yyyy HH:mm:ss tt" 형식에 맞지 않는 경우, 프로그램이 실패합니다. DateTime.Now 형식을 정확하게 사용하는 모든 프로그램에서 InvariantCulture을 사용해야합니다.

+0

이것은 깨진 시스템을 수정하지만 현재 작동중인 시스템을 깨뜨릴 것이라는 점에 유의하십시오. –

+0

@ReedCopsey 물론 OP가 자신의 시스템 전체에서 동일한 문화권을 사용해야하는 이유입니다. –

관련 문제