Разбор более 24 часов в C # - PullRequest
7 голосов
/ 06 марта 2011

Допустим, отметка времени (только время или дата и время), когда время может переноситься на следующий день:

00: 00: 00 <- полночь </p>

01: 00: 00 <- 01:00 </p>

23: 00: 00 <- 11:00 </p>

24: 00: 00 <- полночь, день + 1 </p>

25: 00: 00 <- 1:00, день + 1 </p>

Какой был бы способ легко разобрать его в C # DateTime, который перенес бы перенос на следующий день?Другими словами, «01:00:00» станет «0001-01-01 01:00:00», а «25:00:00» станет «0001-01-02 01:00:00».

РЕДАКТИРОВАТЬ:

Я должен отметить, что это с треском проваливается (например, FormatException):

DateTime.ParseExact("0001-01-01 25:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

Ответы [ 5 ]

8 голосов
/ 06 марта 2011

Поскольку вы пытаетесь представить период времени из произвольной точки, а не как конкретную дату, возможно, вам было бы лучше использовать класс System.TimeSpan ?Это позволяет устанавливать в конструкторе значения более 24 часов и может использоваться с объектами DateTime, например:

System.TimeSpan timestamp = new System.TimeSpan(25, 0, 0);
System.DateTime parsedDateTime = new DateTime(0, 0, 0);
parsedDateTime = parsedDateTime.Add(timestamp);
Console.WriteLine(parsedDateTime.ToString("yyyy-MM-dd HH:mm:ss"));  //Output as "0001-01-02 01:00:00"

ПРИМЕЧАНИЕ: Код не проверен.

РЕДАКТИРОВАТЬ: С точки зрения синтаксического анализа строк, я не могу думать о каких-либо базовых объектов .NET, которые анализируют строки со значениями больше 23 для часа (так как 25 является недопустимым часом дня), но при условии, что формат является единообразным, вы можете создать очень простую процедуру анализа строк (или даже регулярное выражение) для чтения значений по отдельности и загрузки конструктора вручную.

2 голосов
/ 06 марта 2011

Если у вас есть существующее значение DateTime, к которому вы можете добавить, вы всегда можете использовать TimeSpan:

string dt = "25:00:00";
int hours = int.Parse(dt.Split(':')[0]);
TimeSpan ts = TimeSpan.FromHours(hours);

TimeSpan.Parse() не работает напрямую в этом случае, потому что жалуется (достаточно справедливо!)около 25 в час записи.

1 голос
/ 06 марта 2011

Если вы хотите закодировать это ... это должно быть отправной точкой:

 string dateString = "0001-01-01 25:00:00";
 string[] parts = dateString.Split(' '); //now have '0001-01-01' and '25:00:00'

 string datePart = parts[0]; // '0001-01-01'
 string[] timeParts = parts[1].Split(':'); //now have '25', '00', and '00

 DateTime initialDate = DateTime.ParseExact(datePart, "yyyy-MM-dd", CultureInfo.InvariantCulture);//use the date as a starting point

 //use the add methods to get your desired datetime
 int hours = int.Parse(timeParts[0]);
 int minutes = int.Parse(timeParts[1]);
 int seconds = int.Parse(timeParts[2]);

 DateTime resultDate = initialDate.AddHours(hours)
                                    .AddMinutes(minutes)
                                    .AddSeconds(seconds);

Конечно, он предполагает, что входные данные правильно отформатированы и могут быть проанализированы и т. Д. Кроме того, вы можете определенно использовать интервал времени вместо отдельных методов добавления для часа, минуты, секунды, как некоторые другие ответы ..

1 голос
/ 06 марта 2011

На случай, если никто не укажет на нестандартный ответ, вот классный класс ActionScript, который я написал для анализа ввода времени (человеческий вклад) ...

https://github.com/appcove/AppStruct/blob/master/Flex/AppStruct/src/AppStruct/TimeInput.as

Было бы очень просто перенести это на C #, и вы могли бы настроить 24-часовую логику, чтобы получить в результате #days, #hours, # minutes.

Удачи!

1 голос
/ 06 марта 2011

Вы указываете недопустимую дату. Так что вы можете не только не анализировать его, но и хранить его!

Как насчет хорошего объекта TimeSpan вместо этого? (Он также имеет метод Parse().)

В качестве альтернативы, используйте функцию типа sscanf(), например, в http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net, чтобы извлечь каждое число отдельно. (Лучше всего, если у вас нет контроля над читаемым форматом строки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...