Как отформатировать DateTime / TimeSpan из строки в C # - PullRequest
0 голосов
/ 18 марта 2019

Я получаю строку в этом формате «7:00 - 23:00», представляющую время начала и окончания. Строка всегда будет иметь два раза. Теперь мне нужно отформатировать это в соответствии с сегодняшней датой и временем, так что в приведенном выше случае это легко. Это происходит 18 марта 7 утра - 18 марта 11 вечера, но есть крайний случай, когда время похоже на «7:00 - 12:00 утра», в этом случае его нужно будет преобразовать в 18 марта 7 утра - 19 12 марта.

Теперь я могу справиться с этим, если: D. Поэтому, когда второй токен меньше первого токена (например, «7:00 - 02:00»), я могу увеличить дату второй части.

string input = "7:00 am - 12:00 am";
List<DateTime> tokens = input.Split('-').Select(x => DateTime.Parse(x.Trim(), CultureInfo.GetCultureInfo("en-NZ"))).ToList();
if(tokens[1] < tokens[0]){
    tokens[1] = tokens[1].AddDays(1);   
}

enter image description here

Но я хотел бы знать, есть ли какой-либо встроенный способ в самом C # через Timespan, Datetime классы и т. Д. Для его обработки.

1 Ответ

3 голосов
/ 18 марта 2019

Код подходит для перечисленных вами требований, вы можете скрыть часть логики, создав метод расширения и используя DateTime.Hour в вашем операторе if:

public static class StringExtensions
{
    public static IEnumerable<DateTime> ToDateTimePairs(this string input)
    {
        var dates = input.Split('-').Select(x => DateTime.Parse(x.Trim(), CultureInfo.GetCultureInfo("en-NZ"))).ToList();           

        if (dates[1].Hour < dates[0].Hour)
        {
            dates[1] = dates[1].AddDays(1);
        }

        return dates;
    }
}

Ваш код становится:

string input = "7:00 am - 12:00 am";
var dates = input.ToDateTimePairs();
foreach(var date in dates)
{
    Console.WriteLine(date);
}
Console.ReadKey();

В сторону: Вы также можете добавить несколько шагов проверки в ToDateTimePairs() (у вас должно быть только два действительных объекта DateTime после разделения строки и т. Д.). То, как вы реализуете это, зависит от вас; прямо сейчас, если в строке содержится недопустимая дата, вызов DateTime.Parse() вызовет FormatException - если вы хотите самостоятельно выполнить проверку синтаксического анализа, рассмотрите возможность использования DateTime.TryParse() вместо.

...