【问题标题】:Subtracting timespan from 24 hours从 24 小时中减去时间跨度
【发布时间】:2017-03-27 14:08:17
【问题描述】:

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

以案例为例:

我想知道早上 8:00 之前还有多少时间。

如果现在是下午 16:00,timespan 给了我 -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 小时中减去我的潜在负时间跨度?

【问题讨论】:

  • 在 C# 中没有 Joda 时间? ??????
  • @RavindranathAkila > 有一些像nodatime.org 这样的项目。但老实说,DateTime API 非常高效,由于 OP 对 C# 缺乏了解,第一篇文章中的代码非常混乱(Ege,请不要在这里看到任何冒犯),它并不代表对 DateTime 工具的良好使用.
  • @Ege - “8:00 AM”是什么意思?您是指运行代码的计算机上本地时区的上午 8:00 吗?或者也许在地球上的其他地方或世界时?如果我给你一个像“2:30 AM”这样的输入,但它恰好在时钟从 2:00 到 3:00 的春季 DST 过渡的那一天运行,该怎么办?另外,“多少时间”是什么意思?你的意思是经过的时间?或者你的意思是墙上时间的差异?同样,在 DST 转换中,您可能有更多或更少。 Noda Time 将帮助解决所有这些问题。

标签: c# datetime timespan


【解决方案1】:

您混淆了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 点。

【讨论】:

    【解决方案2】:

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

    为此,您必须使用 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

    【讨论】:

      【解决方案3】:

      使用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;
      

      【讨论】:

        【解决方案4】:

        另一点:错误来自 24:00 不代表午夜 12:00 这一事实。 0:00 表示午夜,这将是一个有效的 DateTime。

        【讨论】:

          猜你喜欢
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多