繁体   English   中英

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

[英]Parsing times above 24 hours in C#

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

00:00:00 < - 午夜

01:00:00 < - 1 AM

23:00:00 < - 11 PM

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

25:00:00 < - 凌晨1点,天+ 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);

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

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

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

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

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

相反,一个漂亮的TimeSpan对象怎么样? (它还有一个Parse()方法。)

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

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

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

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

祝好运!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM