有没有一种简单的方法来组合代表 15 分钟时间段的连续字符串值



目前,我以以下形式向用户返回反馈:

"<UserName> removed 07:00, 07:15, 07:30, 07:45, 08:00, 08:15, 08:30, 09:00, 09:15, 09:30, 09:45, 10:00, 10:15, 10:30, 11:15, (etc.)"

。可以理解的是,他们希望它更加用户友好,例如:

<UserName> removed 07:00 - 8:30, 9:00 - 10:30, 11:15 - (etc.)
与其

重新设计将这些值连接到 StringBuilder 的整个方法,我想将第一个输出转换为第二个输出;如下所示:

sbQuarterHoursRemoved = CombineSucceedingQuarterHours(sbQuarterHoursRemoved);

这是否像在我看来那么乏味,或者有人知道一种相对轻松的完成方式?

更新

我把下面的代码改编成这样:

String QuarterHoursRemovedPrettified = PrettifyQuarterHoursRemoved(sbQuarterHoursRemoved);
. . .
private static string PrettifyQuarterHoursRemoved(StringBuilder sbQuarterHoursRemoved)
{
    string[] times = sbQuarterHoursRemoved.ToString().Split(',');
    DateTime prevDt = new DateTime(1);
    string prevString = "";
    StringBuilder output = new StringBuilder();
    foreach (string time in times) {
        DateTime dt = DateTime.ParseExact(time, "HH:mm", CultureInfo.InvariantCulture);
        if (dt.Subtract(prevDt).TotalMinutes > 15) {
            if (prevString != "")
                output.Append(" " + prevString + ",");
            output.Append(" " + time + " -");
        }
        prevString = time;
        prevDt = dt;
    }
    output.Remove(output.Length - 1, 1);
    return output.ToString(); 
}

这样的时间中使用值(在调用 Split() 之后):

00:45
01:00
01:15
22:45
23:00

它总是使通过循环的第二次传递崩溃。第一次进展顺利,但第二次,无论价值如何,都会崩溃。例如,第一次通过,dt 变为:

dt = 6/26/2012 12:45 am

。在调用 ParseExact() 之后

。但是对 ParseExact() 的第二次调用 - 例如,"01:00"作为"time"中的值失败。

一些错误详细信息是:

*System.FormatException 未处理 消息 = 字符串未被识别为有效的日期时间。 来源=mscorlib 堆栈跟踪: at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style) at System.DateTime.ParseExact(String s, String format, IFormatProvider provider) at TitanNextGen_Platypi.PlatypiMainForm.PrettifyQuarterHoursRemoved(StringBuilder sbQuarterHoursRemoved) in...*

再次更新

它现在可以工作了 - 未修剪的瓦尔是问题所在。例如,当值是"01:15"而不是"01:15"时,所有达拉斯都松动了(我在调用 ParseExact() 时将"hh:mm"更改为"HH:mm"以说明 24 小时时间)

好吧,您将需要编写自己的函数,因为您正在操作字符串,而不是原始数据。也就是说,您将能够在线性时间内完成此操作(您只需解析一次字符串)。

步骤包括:

  1. 标记字符串(使用逗号作为分隔符)
  2. 循环遍历这些令牌,每连续 15 分钟间隔递增响应变量。

    7:00, 7:15, 7:30, 7:45, 8:30
    7:00 - 7:30, 7:45, 8:30
    7:00 - 7:45, 8:30
    

只是该过程的一般概述。您需要研究一个字符串分词器(我自己是一个 Java 人,但我知道有一个内置的)您应该能够索引到标记中以引用小时和数十分钟数字,并使用 switch 语句做出相应的响应。

在处理字符串时,您需要跟踪您所在的位置以及是否需要开始一个新序列:

    string[] times = { "07:00", "07:15", "07:30", "07:45", "08:00", "08:15", "08:30", "09:00", "09:15", "09:30", "09:45", "10:00", "10:15", "10:30", "11:15" };
    private void Form1_Load(object sender, EventArgs e)
    {
        DateTime prevDt = new DateTime(1);
        string prevString = "";
        StringBuilder output = new StringBuilder("UserXyz Deleted ");
        foreach (string time in times)
        {
            DateTime dt = DateTime.ParseExact(time,"hh:mm", CultureInfo.InvariantCulture);
            if (dt.Subtract(prevDt).TotalMinutes > 15)
            {
                if (prevString != "")
                    output.Append(" " + prevString + ",");
                output.Append(" " + time + " -");
            }
            prevString = time;
            prevDt = dt;
        }
        output.Remove(output.Length - 1, 1);
        MessageBox.Show(output.ToString());
    }

最新更新