假设一个时间戳(只是时间或日期和时间),时间可以转到第二天:
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);
答案 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);
当然,它假设输入格式正确且可解析等。 此外,您肯定可以使用时间跨度而不是单个,分钟,秒的单独添加方法,因为其他一些答案是..