我试图从24小时中减去潜在的负时间跨度值,将其更改为正值。
作为一个例子:
我想知道有多少时间到早上8点。
如果现在是下午16:00,时间跨度给了我-8 ish值,所以我想从24减去它得到16。
我正在尝试这个,但它给了我这个错误
日历中不支持字符串表示的DateTime System.Globalization.GregorianCalendar。
我尝试了什么;
string startTime = String.Format("{0:t}", "8:00");
TimeSpan timeLeft = Convert.ToDateTime(startTime).Subtract(DateTime.Now);
if (timeLeft.TotalMinutes < 0 )
{
timeLeft = Convert.ToDateTime(String.Format("{0:H}","24:00")).Subtract(Convert.ToDateTime(timeLeft.Negate())) ;
}
如何从24小时内减去潜在的负时间?
答案 0 :(得分:2)
您感到困惑TimeSpan
和DateTime
。我想有一种更简单的方法:
var eightOClock = TimeSpan.FromHours(8);
var now = DateTime.Now;
var till8again = now.TimeOfDay > eightOClock
? TimeSpan.FromHours(32) - now.TimeOfDay
: eightOClock - now.TimeOfDay;
因此,如果TimeOfDay
小于8小时(在早上8点之前),我们将差异调到早上8点。如果它大于上午8点,我们将差值缩小到32小时,即明天上午8点。
答案 1 :(得分:1)
日期时间是绝对日期,发生在某一天,某个月,一年......它不能用于表示特定小时。 所以你试图转换&#34; 8:00&#34;或&#34; 24:00&#34;在DateTime中将强行失败。
为此,您必须使用TimeSpan(如果您总是使用小时,则最终使用整数)。
您可以使用例如
if(DateTime.Now.TimeOfDay > TimeSpan.FromHours(8))
查看它是否多于或少于8:00。
TimeOfDay将返回自午夜以来今天所经过的时间。
DateTime还有很多有用的方法来添加或减去时间,详见https://msdn.microsoft.com/fr-fr/library/system.datetime(v=vs.110).aspx
答案 2 :(得分:1)
使用TimeSpan
,如果startDate
小于Now
,请为其添加一天,然后进行比较。
TimeSpan startTime = new TimeSpan(8,0,0);
TimeSpan now = DateTime.Now.TimeOfDay;
startTime = startTime < now ? startTime.Add(TimeSpan.FromDays(1)) : startTime;
TimeSpan diff = startTime - now;
答案 3 :(得分:0)
另一点:错误来自于24:00不表示午夜12:00的事实。 0:00代表午夜,这将是一个有效的DateTime。