2012-07-17 21 views
3

我想知道是否有人在全球部署應用程序以及他們如何在他們的應用程序中處理日期格式?部署c#應用程序,但由於日期格式測試崩潰

例如,我是英國的,日期格式爲DD/MM/YYYY,但由於日期格式爲MM/DD/YYYY,我的應用程序在美國的客戶崩潰。

將日期保存爲文本到配置文件中,並在應用程序中調用和使用。然而,英國,歐洲和澳大利亞的客戶沒有任何問題,但美國和加拿大的客戶。

我假設.net會處理日期,我使用DateTime.Parse(strDateFromFile),它崩潰。即"12/31/2010"失敗,但是"31/12/2010"沒問題。

在.NET中,我可以做些什麼來確保本地dateformat被正確解析。

我試圖將字符串轉換爲已知的格式,然後再返回,但似乎是一個問題也:

 static public string DateToString(DateTime dtDate) 
    { 
     string strDay = dtDate.Day.ToString(); 
     string strMonth = String.Format("{0:MMMM}", dtDate).ToString(); 
     string strYear = dtDate.Year.ToString(); 
     string strDate = string.Format("{0}-{1}-{2}", strDay, strMonth, strYear); 

     return strDate; 
    } 

    static public DateTime StringToDate(string strDate) 
    { 
     DateTime dtDate = new DateTime(); 

     try 
     { 
      dtDate = DateTime.Parse(strDate); 
     } 
     catch (Exception ex) 
     { 
      Logger.Log.Error(MethodBase.GetCurrentMethod().ToString(), ex); 
      System.Windows.Forms.MessageBox.Show(string.Format("DEBUG INFO: Date Format: {0}\r\n{1}", strDate, ex.Message)); 
     } 
    } 

,我應該如何處理我的申請之日起任何意見將欣然接受,因爲我在整個應用程序中使用日期。

感謝

回答

3

您需要在當前的文化傳遞,當你做一個DateTime.Parse:

DateTime dt = DateTime.Parse("1/1/2000", Thread.CurrentThread.CurrentUICulture);

至於設置文化爲當前線程,我不知道,如果這是根據用戶的設置自動發生的,或者是默認使用在開發過程中使用的文化。

另外請注意,您將需要使用相同的技巧來處理數字和日期時間(也可能是其他人)的ToString調用。如果它成爲一個大問題,你可能會考慮獲得ReSharper,它有使用文化特定的ToStrings的警告。

1

如果你接受用戶輸入,你不會嘗試設置文化信息,你只需要知道什麼時候他們輸入什麼。換句話說,你需要知道他們的文化信息是什麼,並相應地處理它。

System.Globalization命名空間提供了幾乎所需的功能來完成此操作。例如,如果我的應用程序做到這一點我自己的機器上運行時(我在美國):

DateTimeFormatInfo dtfi = CultureInfo.CurrentCulture.DateTimeFormat; 
string dateTimeFormatPattern = dtfi.FullDateTimePattern; 

我得到這個字符串:

DDDD,MMMM DD,YYYY H:毫米:SS TT

或者使用ShortDatePattern:

CultureInfo.CurrentCulture.ShortDatePattern = M/d/yyyy 

您可以使用這些信息來知道該怎麼EXPE ct從用戶,並相應地解析它。

檢查這個問題/回答出:

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/cb19f31c-6d30-4cd9-8644-80ce3ecde52f/

但我認爲,@ Eric_Andres的答案可能更接近你正在尋找...

0

如果您需要配置或日誌或任何發送的文件,然後選擇一種日期格式併爲其創建手動解析器。 Splitstring,通過Substring()int.Parse()他們讀數...

1

我已經被在不同的國家(加拿大,美國)使用的設置文件,但後來他們被檢索到我的系統(我在AU )找出一些東西。當你看(2011年10月1日)是10月1日或10月10日時,情況開始變得非常奇怪。這取決於它來自哪裏,所以我在我的設置文件中遠離人類可讀日期。相反,我使用DateTime.Now.ToBinary並存儲很長的路,它不會影響我加載它的位置,它會始終正確顯示。

對於日誌記錄我總是選擇一種格式,我很滿意並在格式化中使用它。

yyyyMMdd HH:mm:ss.ffff這樣你就不會受到任何區域設置的支配等等。記錄真的是讓你能夠追蹤到一個問題,所以我真的不在乎客戶是否正在嘗試閱讀它。

如果您還在與其他遠程系統協調其他系統,請考慮使用UTC記錄您的信息而不是當地時間。

+0

您是否有將二進制轉換爲格式化數字的示例,例如yyyyMMdd HH:mm:ss.ffff。我可以嘗試轉換DateTime.FromBinary,但在轉換過程中仍然存在問題。 – Belliez 2012-07-18 10:25:44

+0

'theDate.ToString(「yyyyMMdd HH:mm:ss.ffff」)' – 2012-07-18 22:45:15

相關問題