Datetime / Timespan按小时排序

时间:2015-07-25 20:27:11

标签: c#

我有一个对象列表。每个对象都有DateTime属性。

当我添加对象时,通过ParseExact将DateTime实例化到此列表中。

public class Event
{
    public Event(string time)
    {
         Time = DateTime.ParseExact(time, "HH:mm zzz", CultureInfo.InvariantCulture);
    }

    public DateTime Time { get; set; }
}

这允许我添加如下项目:

Events.AddRange(new List<Event> { new Event("07:00 +" + timeZone), new Event("11:30 +" + timeZone), new Event("16:00 +" +timeZone), new Event("19:00 +" + timeZone), new Event("00:00 +" + timeZone), new Event("03:00 +" +timeZone) });

我使用DateTime,因为它处理后台的时区。

问题是;我想创建一个列表,用当前时间对上面的列表进行排序。

因此,如果列表中有["7:30", "5:12", "15:55", "22:22", "23:59"]且当前时间是22:19,那么它将从那时起对其进行排序。 所以它会是:["22:22", "23:59", "5:12", "7:30", "15:55"]

我已经有了这样做的功能:

Events.Sort((x,y) => x.Time.TimeOfDay.CompareTo(y.Time.TimeOfDay));

问题在于,它是在同一天(今天)。

用上面的清单说明(鉴于日期和时间是25/7 22:19,它将是:

["22:22 25/7", "23:59 25/7", "5:12 25/7", "7:30 25/7", "15:55 25/7"]

我希望这说明了我的观点,因为日期应该转到26日,过了午夜,依此类推......

另一件事是,它返回一个列表,只要输入长度,但理想情况下这可以永远继续(希望这是有道理的)。能够要求10件物品会很好,并且它将从当前时间返回接下来的10件物品。

修改:澄清 我获取了DateTimes列表,只有DateTime对象的小时和分钟才相关。 从这一刻起,我想获得接下来的10个,25个或50个DateTimes对象。这可以生成,因为小时和分钟是datetime对象中唯一的相关数据。然后应该立即订购这些物品等等。

编辑2:时区 在上面的代码中,timezone =&#34; 0000&#34;,UTC。 这将在用户端自动将时间转换为用户当前位置。

2 个答案:

答案 0 :(得分:0)

如果日期早于开始日期,您可以在日期中添加1天:

Events.Sort((x, y) =>
{
    var xTime = x.Time;
    var yTime = y.Time;
    if (xTime < startTime)
        xTime = xTime.AddDays(1);
    if (yTime < startTime)
        yTime = yTime.AddDays(1);

    return xTime.CompareTo(yTime);
});

请注意,我比较了日期,而不是TimeOfDay,因为日期不再是同一天。

这给出了预期的结果:

排序前:

25/07/2015 07:30:00 
25/07/2015 05:12:00 
25/07/2015 15:55:00 
25/07/2015 22:22:00 
25/07/2015 23:59:00 

排序后:

25/07/2015 22:22:00 
25/07/2015 23:59:00 
25/07/2015 05:12:00 
25/07/2015 07:30:00 
25/07/2015 15:55:00 

答案 1 :(得分:0)

我最终这样做了。在@JonSkeet之后,我切换到TimeSpan对象而不是DateTime。

public List<Event> Events = new List<Event>();

public void InitializeTimers()
{
    Boss tequalt = new Boss("Tequatl the Sunless", BossPriority.HardCore) { Location = "Splintered Coast", Image = "tequatl.jpg" };
    Events.AddRange(new List<Event>
    {
        new Event("07:00", tequalt),
        new Event("11:30", tequalt)
    });
}

public List<Event> GetEvents(int count)
{
    InitializeTimers();
    var timeSpanPattern = Events.OrderBy(x => x.Time.Hours).ThenBy(x => x.Time.Hours);
    var newOrder = new List<Event>();
    var previousTimes = new List<Event>();
    foreach (var timespan in timeSpanPattern)
    {
        if (timespan.Time.CompareTo(DateTime.Now.TimeOfDay) != -1)
            newOrder.Add(timespan);
        else
            previousTimes.Add(timespan);
    }
    newOrder.AddRange(previousTimes);
    var finalList = new List<Event>();
    for (int i = 0; i < count; i++)
    {
        int extraDays = i / (newOrder.Count);
        int current = i - (extraDays * newOrder.Count);
        if (newOrder[current].Time.CompareTo(DateTime.Now.TimeOfDay) != 1)
            extraDays++;
        DateTime time = DateTime.ParseExact(newOrder[current].Time.Hours + ":" + newOrder[current].Time.Minutes + " +0000", "H:m zzz", CultureInfo.InvariantCulture).AddDays(extraDays);
        var newEvent = new Event { Boss = newOrder[current].Boss, DateAndTime = time, Time = newOrder[current].Time};
        newEvent.CalculateCountdown();
        finalList.Add(newEvent);
    }
    finalList.Sort((x,y) => x.DateAndTime.CompareTo(y.DateAndTime));
    return finalList;
}

鉴于GetEvents(10)(日期是2015年7月27日,时间是11:00),它将返回

[0] = Event.DateAndTime = "27-7-2015 11:30";
[1] = Event.DateAndTime = "28-7-2015 7:00";
[2] = Event.DateAndTime = "28-7-2015 11:30";
[3] = Event.DateAndTime = "29-7-2015 7:00";
[4] = Event.DateAndTime = "29-7-2015 11:30";
[5] = Event.DateAndTime = "30-7-2015 7:00";
[6] = Event.DateAndTime = "30-7-2015 11:30";
[7] = Event.DateAndTime = "31-7-2015 7:00";
[8] = Event.DateAndTime = "31-7-2015 11:30";
[9] = Event.DateAndTime = "1-8-2015 7:00";

它根本不是很好,但它完成了工作,并允许我指定我想要的项目数。

如果有人知道如何优化上述内容,我很乐意接受它作为答案。