簡體   English   中英

來自字符串C#的DateTime轉換

[英]DateTime conversion from string C#

我有一個字符串( 642014 ),格式為Mdyyyy
我想將字符串轉換為04062014ddMMYYYY )。
我嘗試了以下代碼。
請幫忙。

DateTime.TryParseExact("642014", "MMddyyyy",
                       CultureInfo.InvariantCulture,
                       DateTimeStyles.None, out "04062014");

這不是有效的日期格式。

要重點說明的問題是1112014 1st of Nov1st of Nov 11th of Jan

如果您有某種約定可以確定在這些情況下引用的日期,則可以進行某種預處理或手動解析字符串,但不會找到該格式的任何“內置”內容

您的情況看起來像是另一個最廣泛的形式問題。

DateTime.TryParseExact方法

如果您未在自定義格式模式中使用日期或時間分隔符,請對提供程序參數和每個自定義格式說明符的最大格式使用不變的區域性。 例如,如果要在模式中指定小時,請指定較寬的形式“ HH”,而不是較窄的形式“ H”。

因此,有時不使用任何日期或時間分隔符的情況下解析字符串有時可能會成為問題。

例如,讓我們討論"d"自定義格式說明符 對於格式化部分,它用一位數字格式化您的日部分, 且不帶前導零。 但是對於解析,它也可以解析404 它與"M"自定義格式說明符相同 我不是說您應該對04使用d 04 可以 ,但不可以。 您應該始終使用完全適合您的字符串的最佳格式。

這是我對這里發生的事情的看法;

由於存在最廣泛的格式規則,由於您的字符串沒有任何日期分隔符,因此您應設置dM的最寬形式,即ddMM 但我認為,這些說明領先的零個值期待(如: 0604 ),當他們使用個位數,因為究竟他們是 我找不到任何證據支持我的理論,但我仍在調查中。

如果您的字符串始終為 Mdyyyy格式,我有解決方案。 也許這不是最好的解決方案,但我認為如果字符串具有恆定格式,則很有用;

public static DateTime? ParseDate_Mdyyyy(string date)
{
    if (date == null)
        return null;
    if (date.Length < 6)
        return null;
    if (date.Length == 6)
        date = date.Insert(0, "0").Insert(2, "0");
    DateTime dt;
    if (DateTime.TryParseExact(date, "MMddyyyy",
                               CultureInfo.InvariantCulture,
                               DateTimeStyles.None, out dt))
        return dt;
    return null;
}

現在您可以將這種方法用作;

string s = "642014";
DateTime? date = ParseDate_Mdyyyy(s);
Console.WriteLine(date.Value.ToString("ddMMyyyy")); // 04062014

我就此問題與.NET Framework團隊聯系,他們對此做出了回應;

您好Soner,

解析代碼並不是真正在尋找任何分隔符。 這是怎么回事:

對於使用“MMddyyyy” ,解析從DoStrictParse方法開始,該方法將調用ParseByFormat 此方法將獲取格式的第一部分,即“MM” ,然后調用ParseDigits以從我們解析為“642014”的字符串中獲得等效數字,該字符串將給出“64” 請注意,在此之前,如果數字超出所選日歷中月份的范圍(在這里是我們的公歷),則不會進行驗證 解析代碼將對“dd”重復相同的過程,並將得到相等的部分“20” ,然后對“yyyy”重復該過程,但這失敗了,因為它期望4位數字,而我們只有兩位數( “14” )。

對於使用“Mdyyyy” ,它失敗是因為解析“M”部分時幾乎“Mdyyyy”相同的原因,我們知道月份可以是2位數字,因此我們將其映射為“64”並將對“d”進行相同操作將其映射到“20” ,則年份將失敗。 我相信這就是文檔所說的總是使用最廣泛形式的原因。

此處的建議是使用字符串中的2數字形式,例如"06042014" ,並且解析也應以“MMddyyyy”“Mdyyyy”成功。 另一種選擇是插入分隔符"6/4/2014""6/4/2014" "06/04/2014"並解析為"M/d/yyyy"

謝謝,塔雷克

特別感謝; Tarek Mahmoud說,Wes Haggard和Richard Lander。

要解析字符串,請先在相應位置添加斜杠,然后再解析

string str = "642014";
str = str.Insert(2,"/").Insert(1,"/"); 
var result = DateTime.ParseExact(str, "M/d/yyyy",CultureInfo.InvariantCulture);

暫無
暫無

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

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