午夜过后如何获得两个时间跨度之间的时差?

时间:2019-06-26 00:26:15

标签: c#

我有一个开始时间跨度和一个结束时间跨度,我无法弄清楚如何获得实际值。

TempoTotalParagem =  DateTime.Now.TimeOfDay - paragem.HoraInico;

这一直工作到午夜。

我搜索了这个问题,因此我需要增加一天的时间。

所以我尝试了

   TempoTotalParagem =  DateTime.Now.TimeOfDay - paragem.HoraInico + DateTime.Now.AddDays(1).TimeOfDay;


paragem.Hora Inicio = 23:14:00
DateTime.Now.TimeOfDay = 01:38

这给

 TempoTotalParagem =  DateTime.Now.TimeOfDay - paragem.HoraInico + DateTime.Now.AddDays(1).TimeOfDay;

TempoTotalParagem = -19:55:59

我尝试更改日期时间的变量,但这有点复杂,因为在数据库上,列已具有数据的时间跨度。目的是只计算从开始日期到现在的总时间列中有多少时间

编辑

{
    [Table("hParagensRegistos")]
    public class ParagemRegisto
    {
        public int Id { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm:ss}")]
        public TimeSpan HoraInico { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm:ss}")]
        public TimeSpan? HoraFim { get; set; }

        [DataType(DataType.Time)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm:ss}")]
        public TimeSpan? TempoTotal { get; set; }

        public int RegistoId { get; set; }
        public Registo Registo {get;set;}

        public int? ParagemPlaneadaId { get; set; }
        public ParagemPlaneada ParagemPlaneada { get; set; }

        public int? ParagemNaoPlaneadaId { get; set; }
        public ParagemNaoPlaneada ParagemNaoPlaneada { get; set; }
    }
}

为避免混淆,这是具有时间跨度属性的实际模态。

startTime = HoraInico 

2 个答案:

答案 0 :(得分:3)

开始时间和结束时间也应包含日期部分。如果在得到差异时将其包括在内,则结果应该是准确的。

例如:

// startTime is Midnight (which is technically the next day at time 0:00:00)
var startTime = DateTime.Today.AddDays(1); 

// endTime is 11:59pm tomorrow
var endTime = DateTime.Today.AddDays(1).AddHours(23).AddMinutes(59);

// Just subtract the values to get the difference
var timeLeft = endTime - startTime;

// timeLeft is 23:59

这里要考虑一些事项:

  1. 所有DateTime对象都具有DateTime部分。
  2. someDateTime.Date(或DateTime.Today)返回Date部分,并将时间清零(午夜)。
  3. someDateTime.TimeOfDay返回一个TimeSpan,它代表自午夜以来的经过时间,并且根本不包含Date

因此,如果您只是比较时间而不考虑Date,那么您得到的输出是绝对正确的。但是,如果比较完整的DateTime对象,则会得到一个TimeSpan,它可以准确反映两者之间的小时/分钟/秒的总数。

答案 1 :(得分:0)

请勿使用TimeSpan

程序启动时:

paragem.HoraInico = DateTime.Now; // Declare as DateTime not TimeSpan

然后当您需要检查时:

TempoTotalParagem = DateTime.Now - paragem.HoraInico; // Difference of DateTimes is TimeSpan