从 24 小时中减去时间跨度

Subtracting timespan from 24 hours

我正在尝试从 24 小时中减去可能为负的时间跨度值,以将它们更改为正值。

举个例子:

我想知道到 8:00 上午还有多少时间。

如果现在是 16:00 下午,timespan 给了我 -8 左右的值,所以我想从 24 中减去它得到 16。

我正在尝试这个,但它给了我这个错误

The DateTime represented by the string is not supported in calendar 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 小时中减去潜在的负面时间跨度?

您混淆了 TimeSpanDateTime。我想有一个更简单的方法:

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 点,我们将差值取为 32 小时,即明天早上 8 点。

DateTime 是一个绝对日期,发生在某日、某月、某年……不能用来表示特定的时间。 因此,您尝试在 DateTime 中转换“8:00”或“24:00”将强制失败。

为此,您必须使用 TimeSpan(如果您始终使用小时数,则最终使用整数)。

你可以使用例如

if(DateTime.Now.TimeOfDay > TimeSpan.FromHours(8)) 

查看是否大于或小于8:00。

TimeOfDay 将 return 你今天从午夜开始经过的时间。

DateTime 也有很多有用的方法来加减时间,详见https://msdn.microsoft.com/fr-fr/library/system.datetime(v=vs.110).aspx

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;

另一点:错误来自于 24:00 不代表 12:00 午夜。 0:00 表示午夜,这将是一个有效的日期时间。