使用TypeDescriptor.GetConverter.ConvertFromString转换DateTime(使用自定义格式)

时间:2011-04-21 11:06:21

标签: c# datetime

有没有办法制作

TypeDescriptor.GetConverter.ConvertFromString使用自定义格式转换为DateTime,例如“2011-04-21 13-03-56”?

如果没有,是否有任何DateTime格式可以应用于文件夹名称(/,\,:等,如你所知不允许)?

非常感谢帮助。提前致谢 随机-I-Am的

编辑:

由于我的要求似乎仍未被正确理解,我再次试图详细阐述我的问题。我的用户正在创建具有特定名称的文件夹例如“1000_Link_Topic1_2011-01-25 14-12-10”。他们可以根据自己的喜好自由组合信息,并在需要时省略信息。他们甚至不必关心区分大小写。所以我可以面对另一个名为“1000_link_Topic2”的文件夹。

我所拥有的是一个单独的类,每个可能的信息片段都有一个属性。在这种情况下,我会(因为我必须找到一种方法来检查每个属性的默认值,无论我使用可空类型的属性类型):

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

我的代码显然将文件夹名称拆分为“_”,然后告诉每个片段它属于哪种属性类型。一旦我知道我想要转换为Type的相应类型,让我们说使用TypeDescriptor.GetConverter(t).ConvertFromString(info_frag[i])。我希望你现在明白为什么我不能使用另一种转换方法。

该代码适用于上述所有类型。我的问题是找到一个可以在文件夹名称上使用的自定义DateTime格式。我所知道的所有格式都使用冒号来分隔小时和分钟。

我想要的是一种使用TypeDescriptor.GetConverter.ConvertFromString自定义DateTime格式转换为 DateTime对象的方法。如果那是不可能的,我要么找到一个标准的DateTime格式,可以将其指定为文件夹名称而不进行任何进一步的转换,或以某种方式按我的自定义格式扩展内置的DateTime格式。如果它将成为后者我不关心能够使用秒或分钟。工作时间可以完成。

再次感谢您和您一样耐心并帮助我解决这个问题。随意提出任意多个问题。我希望你能帮助我让这个工作。

随机-I-Am的

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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;