时间跨度(2)其他时间跨度加/减分钟C#

时间:2015-05-13 17:08:27

标签: c# linq datetime timespan

如果我通过" 15分钟"一切都有例外。我没有收到任何错误,只是因为我的where子句不是100%工作。这是b / c我以15分钟的间隔传递时间。

示例:

  • 对象1的时间为00:20(上午12:20)(24小时格式)
  • 对象2的时间为02:15(02:15 am)(24小时格式)

parsedTime 参数是一个24小时的javascript格式时间 - 在这个例子中是" 00:15"。

问题是当我从 parsedTime 中减去-30分钟时,它将它放在23:45,因此永远不会得到" 00:20"。

LINQ查询

DateTime parsedTime = DateTime.ParseExact(time, "HH:mm", CultureInfo.InvariantCulture);

var activities = objects
          .Where(x => (x.GetValue<DateTime>("startTime").TimeOfDay 
                      >= parsedTime.AddMinutes(-30).TimeOfDay
                 && x.GetValue<DateTime>("startTime").TimeOfDay 
                     <= parsedTime.AddMinutes(30).TimeOfDay))
          .ToList();

2 个答案:

答案 0 :(得分:2)

你只是想看看他们是否在30分钟之内,对吧?尝试使用实际的时间跨度

DateTime startTime;
DateTime parsedTime;
TimeSpan difference = startTime - parsedTime;
return difference.TotalMinutes < 30 && difference.TotalMinutes > -30;

答案 1 :(得分:1)

听起来你还需要处理可能跨越午夜的时间范围,就像在"23:45""00:15"之间存在的30分钟一样。以下是如何做到这一点:

public static TimeSpan GetTimeDifference(string startTimeOfDay, string endTimeOfDay)
{
    DateTime startDateTime = DateTime.ParseExact(startTimeOfDay, "HH:mm",
        CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);

    DateTime endDateTime = DateTime.ParseExact(endTimeOfDay, "HH:mm",
        CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);

    if (endDateTime >= startDateTime)
    {
        // values do not cross over midnight
        return endDateTime - startDateTime;
    }
    else
    {
        // values cross over midnight
        return endDateTime - startDateTime + TimeSpan.FromHours(24);
    }
}

或者如果你喜欢更小的东西:

public static int GetMinutesDifference(string startTimeOfDay, string endTimeOfDay)
{
    DateTime startDateTime = DateTime.ParseExact(startTimeOfDay, "HH:mm",
        CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);

    DateTime endDateTime = DateTime.ParseExact(endTimeOfDay, "HH:mm",
        CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);

    return (((int)(endDateTime - startDateTime).TotalMinutes + 1440) % 1440);
}