System.Convert.ChangeType для DateTime

105
18 марта 2021, 07:30

Есть generic-метод для преобразования типов, для всех типов в принципе он работает адекватно:

public static class TypedConverter<T>
{
    public static T Convert(object value, T defaultValue)
    {
        try { return (T)System.Convert.ChangeType(value, typeof(T)); }
        catch { return defaultValue; }
    }
}

Вот скриншот отображающий ситуацию

Таким образом, конвертация работает для строки "04/30/2019 04:40 PM" но не для "30/04/2019 04:40 PM"ю Прошу помощи

Answer 1

Всегда указывайте культуру. Запустите код, установив русскоязычную культуру - получите один результат. Установите англоязычную культуру - будет другой результат.

Месяцев только 12, их не может быть 30. Как я понял, вы хотите, чтобы принимались оба формата: "dd/MM" и "MM/dd"?

Тогда используйте DateTime.ParseExact (третью перегрузку), задав массив желаемых форматов.

public static class Converter
{
    static string[] formats = new string[] { "MM/dd/yyyy hh:mm tt", "dd/MM/yyyy hh:mm tt" };
    public static DateTime Convert(string value, DateTime defaultValue = new DateTime())
    {
        try
        {
            return DateTime.ParseExact(
                value, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);
        }
        catch { return defaultValue; }
    }
}

Использование:

var dates = new string[] {
    "04/30/2019 04:40 PM",
    "30/04/2019 04:40 PM",
    "04/05/2019 04:40 PM",
    "05/04/2019 04:40 PM" };
foreach (var date in dates)
{
    Console.WriteLine(Converter.Convert(date));
}

Этот код сконвертирует все 4 представленных значения.
Однако, два последних могут дать не тот результат, который ожидался. Это может быть как 4 мая, так и 5 апреля. Результат будет меняться в зависимости от порядка строк в массиве formats - какой формат первым совпадёт, тот и выдастся.

Answer 2

Есть решение, это указывать культуру третьим параметром.

К примеру CultureInfo ci = new CultureInfo("Ru-ru");

public static class TypedConverter<T> {
    public static T Convert(object value, T defaultValue, CultureInfo culture) {
        return (T)System.Convert.ChangeType(value, typeof(T), culture);
    }
}
READ ALSO
Как я могу создать UI элемент под спрайтом?

Как я могу создать UI элемент под спрайтом?

У меня есть Canvas который создает префабы(UI) ,но дело в том что мне нужно иметь один спрайт который всегда должен находиться над ними(префабы...

98
C# Передача данных из асинхронного метода

C# Передача данных из асинхронного метода

Есть метод, который асинхронно выполняет загрузку файлов, как задачу методом WebClientDownloadFileTaskAsync

83
Ускорение работы программы

Ускорение работы программы

Проблема заключается в том, что моя программа не может справится со своей задачей, слишком много данных проходит один поток данных

85
Telegram winapi открытие канала без браузера

Telegram winapi открытие канала без браузера

Всем привет, если в браузере вставить ссылку на канал https://tme/durov, то при условии если установлен телеграм, то вы автоматически перейдете на этот...

80