在C#中解析时间超过24小时

时间:2011-03-06 04:00:26

标签: c# datetime

假设一个时间戳(只是时间或日期和时间),时间可以转到第二天:

  

00:00:00< - 午夜

     

01:00:00< - 1 AM

     

23:00:00< - 11 PM

     

24:00:00< - 午夜,白天+ 1

     

25:00:00< - 1 AM,day + 1

什么方法可以轻松地将其解析为将执行结转到第二天的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 个答案:

答案 0 :(得分:8)

由于您试图从任意点而不是特定日期表示一段时间,或许您最好使用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是一个无效小时的但是假设格式是一致的,你可以创建一个非常简单的字符串解析例程(甚至是正则表达式)来单独读取值,并手动加载构造函数。

答案 1 :(得分:2)

如果您有可添加的现有DateTime值,则可以始终使用TimeSpan:

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

TimeSpan.Parse()在这种情况下无法直接起作用,因为它抱怨(足够公平!)关于25小时表示法。

答案 2 :(得分:1)

您指定的日期无效。所以你不仅不能解析它,你也不能存储它!

一个漂亮的TimeSpan对象呢? (它还有一个Parse()方法。)

或者,使用sscanf()类型的函数(如http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net处的函数)将每个数字分开提取。 (如果您无法控制正在读取的字符串格式,则为最佳。)

答案 3 :(得分:1)

如果没有人指出一个开箱即用的答案,这里是一个整洁的ActionScript类,我写的是解析时间输入(人工输入)......

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

将它移植到C#非常简单,你可以调整24小时逻辑来产生#days,#hours,#minutes。

祝你好运!

答案 4 :(得分:1)

如果你想编写代码......这应该是一个起点:

 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);

当然,它假设输入格式正确且可解析等。 此外,您肯定可以使用时间跨度而不是单个,分钟,秒的单独添加方法,因为其他一些答案是..