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



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

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 

开始时间和结束时间还应包含日期部分。如果在获得差异时包括此内容,则结果应该是准确的。

例如:

// 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

不要使用TimeSpan

程序启动时:

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

然后当你需要检查时:

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

最新更新