2011-04-21 80 views
0

有沒有什麼辦法讓轉換日期時間與TypeDescriptor.GetConverter.ConvertFromString(使用自定義格式)

TypeDescriptor.GetConverter.ConvertFromString轉換爲DateTime使用自定義格式,例如「2011-04-21 13-03-56」?

如果沒有,那裏是否有任何可以應用於文件夾名稱(/,\,等等,不被允許,如你所知)的日期時間格式?

幫助非常感謝。在此先感謝 隨機I-上午

編輯:

由於我的要求似乎仍然不被理解正確,我試圖再次闡述一下我的問題。我的用戶正在使用特定名稱創建文件夾。例如「1000_Link_Topic1_2011-01-25 14-12-10」。他們可以自由組合他們喜歡的信息,並在需要時省略信息。他們甚至不必關心區分大小寫。所以我可能會遇到另一個名爲「1000_link_Topic2」的文件夾。

我所擁有的是一個具有單個屬性的單個類,用於每個可能的信息片段。在這種情況下,我會(因爲我只好找檢查每個屬性的默認值,而不管物業類型我使用可空類型的一種方式):

Short? short_val; 
EContentType? enum_val; 
String string_val; 
DateTime? datetime_val; 

我的代碼顯然拆分的文件夾名稱爲「_」然後告訴每個片段它屬於哪個屬性類型。只要我知道相應的類型,我試圖轉換爲類型,讓我們說噸,使用TypeDescriptor.GetConverter(t).ConvertFromString(info_frag[i])。我希望你現在明白爲什麼我不能使用另一種轉換方法。

該代碼適用於上述所有類型。我的問題是找到可以在文件夾名稱上使用的自定義日期時間格式。我所知道的所有格式都是使用冒號來分隔幾分鐘和幾秒的小時數。

我想是一個自定義DateTime格式使用TypeDescriptor.GetConverter.ConvertFromString轉換爲一個DateTime對象的方式。如果這是不可能的,我需要找到一個標準的DateTime格式,它可以被指定爲一個文件夾名稱,而不需要進一步轉換,或者以某種方式通過我的自定義格式擴展內置的DateTime格式。如果它將成爲後者,我不在乎能夠使用秒或分鐘。時間將完成這項工作。

再次感謝您像您一樣耐心,並幫助我解決這個問題。隨意問你許多更多的問題,只要你喜歡。我希望你能幫助我得到這個工作。

隨機I-上午

+0

應該是什麼讓您的約會時間 – Dotnet 2011-04-21 11:10:53

+0

其實我真的不關心什麼格式的輸出格式我在用。我唯一的限制是我可以使用它並將其應用於文件夾名稱。 – 2011-04-21 11:12:28

+0

你是否需要秒鐘才能進入文件夾名稱 – Dotnet 2011-04-21 11:15:44

回答

5

我看過您的問題一點,發現標準DateTimeTypeConverter使用DateTime.Parse內部不聽的CurrentCulture信息都沒有。相反,您可以使用您自己的TypeConverter欺騙轉換過程!

我不知道如何將新的typeconverter附加到現有的DateTime結構,如果你甚至可以,所以我做了一個Miniture AdvancedDateTime結構..它是空的。沒有人說你的自定義TypeConvert甚至應該返回這樣的事情!這一個返回一個常規的DateTime。我提供的代碼如下:

public class CustomDateTimeTypeConverter : TypeConverter 
{ 
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     return DateTime.ParseExact(value.ToString(), "yyyy-MM-dd HH-mm-ss", culture); 
    } 
} 

[TypeConverter(typeof(CustomDateTimeTypeConverter))] 
struct AdvancedDateTime 
{ 
} 

[TestFixture] 
public class DateTime 
{ 
    [Test] 
    public void TypeConvert_StrangeFormat_ConvertsWithoutProblem() 
    { 
     string datetime = "2011-04-21 23-12-13"; 
     TypeConverter converter = TypeDescriptor.GetConverter(typeof (AdvancedDateTime)); 
     var convertedFromString = converter.ConvertFromString(datetime); 
     Assert.AreEqual(new DateTime(2011,4,21, 23,12,13), convertedFromString); 
    } 
} 
+0

- ,這會將DateTime轉換爲未被詢問的字符串! – 2011-04-21 11:14:00

+0

我認爲他沒有閱讀我的編輯。如果沒有編輯,這將是一個有價值的答案。無論如何,謝謝你的貢獻。 – 2011-04-21 11:15:59

+0

@Andreas:謝謝你指出!我糾正了我的答案,同時考慮到了編輯。 – Jaapjan 2011-04-21 11:20:27

1

試試這個

string m_strDate = DateTime.Now.ToString("MM/dd/yyyy"); 
m_strDate = m_strDate.Replace("/", ""); 

追加這個m_strDate到您的文件夾

我用文本文件示例如下

strPath += "/FileHeader_" + m_strDate + ".txt"; 

檢查此示例

DateTime dt=new DateTime(1990,5,6); 
Console.WriteLine(TypeDescriptor.GetConverter(dt).ConvertTo(dt, typeof(string))); 
string myStr="1991-10-10"; 
Console.WriteLine(TypeDescriptor.GetConverter(dt).ConvertFrom(myStr)); 

我寫的示例代碼只是爲了顯示按你需要嘗試按您的要求

 string s = "Folder"; 
     DateTime dt = new DateTime(1990, 5, 6); 
     string str = TypeDescriptor.GetConverter(dt).ConvertTo(dt, typeof(string)).ToString(); 
     string myStr = "1991-10-10"; 
     string str1 = TypeDescriptor.GetConverter(dt).ConvertFrom(myStr).ToString(); 
     s = s + str1.Replace("/", "").Replace(":", ""); 
     textBox1.Text = s; 
+0

如果您需要,還可以根據需要添加更改秒數 – Dotnet 2011-04-21 11:18:14

+0

如何使用此方法稍後將文件夾名稱轉換回給定的DateTime對象上面的限制? – 2011-04-21 11:21:04

+0

@Andreas他沒有要求轉換,他只是問如何將日期時間添加到文件夾名稱 – Dotnet 2011-04-21 11:21:35