C#循环每30分钟遍历24小时

9
我想知道如何循环遍历日期时间或任何类型的变量,以便从上午12:00到下午11:59每30分钟进行一次?
因此,我需要一个以12小时格式显示时间(01:00PM,09:00AM)的变量,并且每次循环时都要将30分钟添加到时间中?然后我需要在字符串中使用此值。
时间需要从上午10:00开始。

为什么要循环?从您的描述中,可以轻松确定每天任何时间字符串应该是什么? - Paddy
@Paddy - 我觉得楼主想要循环遍历从上午10:00到上午9:59的每个值,每次增加30分钟。不过,说实话,我也不太确定。问题表述不太清楚。 - Richard Marskell - Drackir
8个回答

16

而且总是有LINQ

var start = DateTime.Today;
var clockQuery = from offset in Enumerable.Range(0, 48)
                 select start.AddMinutes(30 * offset);
foreach (var time in clockQuery)
    Console.WriteLine(time.ToString("hh:mm tt"));

... LINQ + FUNC(用于参数化启动)

Func<DateTime, IEnumerable<DateTime>> clockQuery = start =>
    from offset in Enumerable.Range(0, 48)
    select start.AddMinutes(30 * offset);
foreach (var time in clockQuery(DateTime.Today))
    Console.WriteLine(time.ToString("hh:mm tt"));

...或者如果你只想要TimeSpan的偏移量...

var start = DateTime.Today;
var clockQuery = from offset in Enumerable.Range(0, 48)
                 select TimeSpan.FromMinutes(30 * offset);
foreach (var time in clockQuery)
    Console.WriteLine((start + time).ToString("hh:mm tt"));

在foreach循环中,有没有一种方法可以指定我想要开始的时间? - user380432
жИСиЃ§дЄЇеЇФиѓ•дљњзФ®Enumerable.Range(0, 47)пЉМеЫ†дЄЇ0..48дЉЪзїЩдљ†49жђ°пЉМињЩе∞ЖеѓЉиЗіиґЕињЗ24.5е∞ПжЧґзЪДдЄЛдЄА姩гАВ - gunwin
那个第二个值是一个计数而不是一个边界。 - Matthew Whited

6

You could use an extension method:

public static class DateTimeHelper
{
    public static IEnumerable<DateTime> GetHalfHours(this DateTime dt)
    {
        TimeSpan ts = TimeSpan.FromMinutes(30);
        DateTime time = dt;
        while(true)
        {
            yield return time;
            time.Add(ts);
        }
    }
}

1
实现为IEnumerable会得到+1分。但是while(true)会使它永远枚举下去,不是吗? - Radu094
1
是的,这是一个无限序列-肯定不能在这个上面执行.ToList(),但你可以执行dt.GetHalfHours().Take(5),即获取接下来的5个“半小时”-所有这些都能工作,因为Linq是惰性的。 - BrokenGlass

3

something like this?

DateTime timeloop = new DateTime(0);
timeloop = timeloop.Add(new TimeSpan(10, 00, 0)); //start at 10:00 AM

            for (int i = 0; i < 48; i++)
            {
                string time =timeloop.ToString("hh:mm tt");           //print it as 1:30 PM
                timeloop = timeloop.Add(new TimeSpan(0, 30, 0));      //add 30 minutes
                               }

2

DateTime可以进行简单的算术运算:

DateTime time = DateTime.Now;
time = time + TimeSpan.FromMinutes(1);

导致时间增加一分钟。
您可以使用计时器类,每次滴答声增加适当的时间量,并将DateTime增加。如果准确性很重要,则还有其他更合适的计时器类。 TimeSpan类还有其他静态方法!

1
var times = new List<string>();
DateTime today = DateTime.Today;
DateTime tomorrow = today.AddDays(1);
for (var i = today; i < tomorrow; i = i.AddMinutes(30))
{
    times.Add(i.ToShortTimeString());
}

0
        DateTime time = new DateTime(2011,02,22,10,0,0);
        List<String> times = new List<string>();

        for (int i = 0; i < 48; i++)
        {
            time = time.AddMinutes(30);
            times.Add(time.ToString());
        }

这可能会满足你的需求


0

类似这样的代码应该适合您:

    int workCount = 0;
    var timer = new System.Timers.Timer(1800000);   // every half hour
    timer.AutoReset = true;

    timer.Elapsed += (src, e) =>
    {
        Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));

        if(++workCount == 48)
        {
            timer.Stop();
        }
    };

    timer.Start();

0
        DateTime endDate = DateTime.Now;
        DateTime startDate = endDate.AddDays(-1);

        while (startDate.AddMinutes(30) <= endDate)
        {
            string sdate = startDate.ToString("yyyy-MM-dd HH:mm");
            string edate = startDate.AddMinutes(29).ToString("yyyy-MM-dd HH:mm");

            string display = string.Format("{0} - {1}", sdate, edate);

            Console.WriteLine(display);
            startDate = startDate.AddMinutes(30);
        }

欢迎来到Stack Overflow!请不要仅仅回答源代码,尽量提供一个关于你的解决方案如何工作的好描述。参见:如何撰写一个好的答案?。谢谢。 - sɐunıɔןɐqɐp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接