2015-11-19 25 views
1

我有一個系統,其中每行的開頭都使用當前日期時間生成日誌文件。DateTime.ToString將結果字符串格式化並將其反轉回日期時間

例如。

LogUtil.Logger(DateTime.ToString("yyyy/MM/dd") + "|" + "My Message Here"); 

根據文化的不同,這個日誌文件可能導致年,月,日之間的不同分隔符。

例如。

2015/11/19 or 2015.11.19 

我寫一個單獨的實用工具,藉此生成的日誌文件,並解析它,發送其它信息給第三方。

由於日期格式不同,我怎樣才能得到它每次正確解析它。

目前即時通訊使用:

DateTime.TryParseExact(line.Substring(0, 10), "yyyy/MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out Date); 

此格式說明只有正確格式2015/11/19

+0

問題是? –

+0

@JamieR我怎樣才能用相同的代碼解析日誌。如果日期是2015.11.19,並且只能在2015/11/19 – CathalMF

+0

下運行,則它將失敗如果第一個解析失敗,請嘗試使用其他格式解析它 – user2867342

回答

2

您可以通過多種格式DateTime.TryParseExact。使用那個overload

DateTime.TryParseExact(line.Substring(0, 10), 
        new[] {"yyyy/MM/dd", "yyyy.MM.dd"}, 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.None, 
        out Date); 

這應該兩種格式:2015/11/19 or 2015.11.19

+0

如果隨機客戶先生決定進入他的區域設置並將日期格式更改爲使用*而不是。或/ – CathalMF

+0

@CathalMF:問題的根源在於你讓用戶的設置影響日誌文件的格式。在解決該問題之前,解析日誌文件的任何方法都將變得脆弱。 – StriplingWarrior

+0

@CathalMF,你不能對所有可能的選項進行編程,你可以通過['DateTimeFormatInfo.DateSeparator'](https://msdn.microsoft.com/en-us/library/system.globalization)來請求Separator屬性.datetimeformatinfo.dateseparator(v = vs.110).aspx)屬性,看看它是否存在於你的輸入字符串中,用你的格式中常見的替換它並進行解析。但最好的選擇是使用單一的格式,通常應用程序日誌是爲你準備的,它不適合用戶。 – Habib

0

如果你可以告訴它的文化是用來產生給定的日誌文件,使用文化,而不是InvariantCulture的。

var culture = CultureInfo.GetCultureInfoByIetfLanguageTag("tr-TR"); // e.g. 
DateTime.TryParseExact(line.Substring(0, 10), 
       "yyyy/MM/dd", 
       culture, 
       DateTimeStyles.None, 
       out Date); 

爲了防止將來出現問題,我強烈建議首先生成帶有不變文化的日誌文件輸出。

相關問題