C#获取2个日期时间对象之间的整数小时值

时间:2013-07-08 13:41:35

标签: c# .net datetime

我试图在2个日期时间之间获得受影响的时间,我发现的只是一个python解决方案。

例如'start'是09:30,'end'是14:00(同一天)。我想要返回的值是

[9:00, 10:00, 11:00, 12:00, 13:00, 14:00]

Python get whole hour values between 2 datetime objects

我似乎找不到任何与C#相同的东西。

9 个答案:

答案 0 :(得分:6)

所以你想要两个日期之间所有小时的清单?您可以使用此查询:

TimeSpan ts =  dt2 - dt1;
IEnumerable<int> hoursBetween = Enumerable.Range(0, (int)ts.TotalHours)
    .Select(i => dt1.AddHours(i).Hour);

示例日期:

DateTime dt1 = new DateTime(2013, 07, 08, 15, 50, 00);
DateTime dt2 = new DateTime(2013, 07, 10, 19, 30, 00);
TimeSpan ts =  dt2 - dt1;

IEnumerable<int> hoursBetween = Enumerable.Range(0, (int)ts.TotalHours)
    .Select(i => dt1.AddHours(i).Hour);

foreach (int hour in hoursBetween)
    Console.WriteLine(hour);

输出:

15
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

答案 1 :(得分:3)

以下内容将返回两个DateTime对象之间的总小时数

(datevalue1 - datevalue2).TotalHours

对于自定义行为,例如显示小时列表,请在创建的Timespan上使用简单的自定义方法,以获得所需格式的小时列表。

我头顶的代码建议:

public List<String> GenerateHours(DateTime t1,DateTime t2){
    if ((t2-t1).TotalHours >24)){
        //decide what to do.
        return null;
    }else{
        var currentHour = t2.Hour;
        var list = new List<String>();
        for (int i=0;i<(t2-t1).TotalHours;i++){
            if (currentHour<10){
                list.Add("0"+currentHour+":00");
            }else if (currentHour>=10){
                list.Add(currentHour+":00");
            }
            currentHour= (currentHour+1)%24;
        }
        return list;
    }
}

答案 2 :(得分:2)

TimeSpan ts = DateTime1 - DateTime2;
double totalHours = ts.TotalHours;

From MSDN:“获取以整数小时表示的当前TimeSpan结构的值。”

编辑:好的,现在我看到了你的要求。怎么样:

var d1 = DateTime.Today.AddHours(9.5);
var d2 = DateTime.Today.AddHours(14);

var first = new DateTime(d1.Year, d1.Month, d1.Day, d1.Minute == 0 ? d1.Hour : d1.Hour + 1, 0, 0);
var second = new DateTime(d2.Year, d2.Month, d2.Day, d2.Minute == 0 ? d2.Hour : d2.Hour + 1, 0, 0);

TimeSpan ts = second - first;

//returns DateTimes affected. I.e., Today at, [10:00, 11:00, 12:00, 13:00, 14:00]
IEnumerable<DateTime> dates = Enumerable.Range(0, (int)ts.TotalHours + 1).Select(hour => first.AddHours(hour));

//Or, if you just want the HOURs
//returns just ints: i.e., DateTimes 10,11,12,13,14
IEnumerable<int> hours = Enumerable.Range(0, (int)ts.TotalHours + 1).Select(hour => first.AddHours(hour).Hour);

如果您实际拥有跨越天数的日期,则需要第一种方法。如果你不这样做,那么只返回小时数的第二种方法就可以了。

答案 3 :(得分:1)

这应该可以解决问题。在LinqPad中测试过。

var startDate = new DateTime(2013, 8, 7, 9, 30, 0);
var endDate = new DateTime(2013, 8, 7, 14, 0, 0);

List<string> times = new List<string>();

var currentTime = startDate;
if (currentTime.Minute != 0 || currentTime.Second != 0) {
    // Get next hour
    currentTime = currentTime.AddHours(1).AddMinutes(currentTime.Minute * -1);
}

while (currentTime <= endDate) {
    times.Add(string.Format("{0:00}:00", currentTime.Hour));
    currentTime = currentTime.AddHours(1);
}

答案 4 :(得分:0)

(int)Math.Abs((date1 - date2).TotalHours)

答案 5 :(得分:0)

简单地减去它们并从结果中得到总小时数。像这样:

var totalHours = (dateTime1 - dateTime2).TotalHours;

答案 6 :(得分:0)

也许这样的事情可行吗?

    public static List<DateTime> GetAffectedHours(DateTime start, DateTime end)
    {
        List<DateTime> result = new List<DateTime>();

        // Strip start of its minutes/seconds/etc
        DateTime initial = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0);

        // Go ahead and get the next hour
        DateTime iterator = initial.AddHours(1.0);

        // if it is still before the end
        while (iterator < end)
        {
            // add it to the results list
            result.Add(iterator);

            // and get the next hour
            iterator = iterator.AddHours(1.0);
        }

        return result;
    }

答案 7 :(得分:0)

您可以使用For循环

List<int> allHoursBetween = new List<int>();

for (DateTime d = myStartDate; d <= myEndDate; d = d.AddHours(1))
     allHoursBetween.Add(d.Hour);

答案 8 :(得分:0)

public IEnumerable<DateTime> GetHoursBetween(DateTime start, DateTime end)
{
    DateTime first = start.Date.AddHours(start.Hour);
    for (DateTime dateTime = first; dateTime <= end; dateTime = dateTime.AddHours(1))
    {
        yield return dateTime;
    }
}
相关问题