Конвертировать DateTime с TypeDescriptor.GetConverter.ConvertFromString (используя пользовательский формат) - PullRequest
0 голосов
/ 21 апреля 2011

Есть ли способ сделать

TypeDescriptor.GetConverter.ConvertFromString преобразовать в DateTime, используя пользовательский формат, например "2011-04-21 13-03-56"

Если нет, существует ли какой-либо формат DateTime, который можно применить к имени папки (/, \,: и т.

Помощь очень ценится. заранее спасибо Random-I-Am

Edit:

Поскольку моя просьба все еще не совсем понятна, я снова пытаюсь уточнить свой вопрос. Мои пользователи создают папки с конкретными именами. Например, «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, который можно использовать для имени папки. Все известные мне форматы используют двоеточия для отделения часов от минут и секунд.

Мне нужен способ преобразования из пользовательского формата DateTime в объекта DateTime с использованием TypeDescriptor.GetConverter.ConvertFromString. Если это невозможно, мне нужно либо найти стандартный формат DateTime, который можно назначить в качестве имени папки без какого-либо дальнейшего преобразования, либо как-то расширить встроенные форматы DateTime с помощью моего собственного формата. Если это будет последнее, меня не волнует возможность использовать секунды или минуты. Часы сделают работу.

Еще раз спасибо за то, что вы так терпеливы и помогаете мне с этим. Не стесняйтесь задавать столько вопросов, сколько захотите. Надеюсь, вы поможете мне заставить его работать.

Random-I-Am

Ответы [ 2 ]

5 голосов
/ 21 апреля 2011

Я немного рассмотрел вашу проблему и обнаружил, что стандартный DateTimeTypeConverter использует DateTime.Parse для внутреннего использования, который вообще не слушает информацию CurrentCulture.Вместо этого вы можете обмануть процесс преобразования с помощью своего собственного TypeConverter!

Я не знаю, как присоединить новый преобразователь типов к существующей структуре DateTime, если вы можете, поэтому я создал структуру AdvancedDateTime miniture .. которая пуста.Никто не сказал, что ваш пользовательский 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 голос
/ 21 апреля 2011

Попробуйте это

 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...