簡體   English   中英

DateTime.TryParse問題的日期為yyyy-dd-MM格式

[英]DateTime.TryParse issue with dates of yyyy-dd-MM format

我有以下日期的字符串格式“ 2011-29-01 12:00 am”。 現在,我嘗試使用以下代碼將其轉換為日期時間格式:

DateTime.TryParse(dateTime, out dt); 

但是我總是以{1/1/0001 12:00:00 AM}作為dt,能告訴我為什么嗎? 以及如何將該字符串轉換為日期。

編輯:我剛剛看到每個人都提到使用格式參數。 我現在要提到的是,我無法使用format參數,因為我有一些設置來選擇用戶想要的自定義dateformat,並且基於該用戶,它可以通過jQuery datepicker自動以該格式獲取文本框中的日期。

這應基於您的示例“ 2011-29-01 12:00 am”而起作用

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);

您需要使用ParseExact方法 這將字符串作為第二個參數,該字符串指定datetime的格式,例如:

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

如果用戶可以在UI中指定格式,則需要將其轉換為可以傳遞給此方法的字符串。 您可以通過允許用戶直接輸入格式字符串來做到這一點-盡管這意味着轉換很可能會失敗,因為他們輸入無效的格式字符串-或具有一個組合框為用戶提供可能的選擇,而您設置這些選項的格式字符串。

如果輸入可能不正確(例如用戶輸入),則最好使用TryParseExact而不是使用異常來處理錯誤情況:

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

更好的替代方法可能是向用戶提供日期格式的選擇,而是使用采用一系列格式重載

// A list of possible American date formats - swap M and d for European formats
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                   "MM/d/yyyy HH:mm:ss.ffffff" };
string dateString; // The string the date gets read into

try
{
    dateValue = DateTime.ParseExact(dateString, formats, 
                                    new CultureInfo("en-US"), 
                                    DateTimeStyles.None);
    Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
    Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}                                               

如果您從配置文件或數據庫中讀取可能的格式,則可以在遇到人們想要輸入日期的所有不同方式時將其添加到其中。

嘗試使用安全的TryParseExact方法

DateTime temp;
string   date = "2011-29-01 12:00 am";

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);

從msdn上的DateTime

類型:System.DateTime%當此方法返回時,如果轉換成功,則包含等於s中包含的日期和時間的DateTime值;如果轉換成功,則包含MinValue 如果s參數為null,為空字符串(“”)或不包含日期和時間的有效字符串表示,則轉換將失敗。 該參數未初始化地傳遞。

請使用parseexact,其格式字符串為"yyyy-dd-MM hh:mm tt"

這樣可行:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

如果讓用戶有機會更改日期/時間格式,則必須創建一個相應的格式字符串以進行解析。 如果您知道可能的日期格式(即用戶必須從列表中選擇),則這會容易得多,因為您可以在編譯時創建這些格式字符串。

如果讓用戶對日期/時間格式進行自由格式設計,則必須在運行時創建相應的DateTime格式字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM