将持续时间从 String 转换为 TimeSpan

Convert time duration from String to TimeSpan

我有一个包含星期几、时间和持续时间的字符串。例如。星期一, 10:00 AM, 45m

时长可以是以下格式之一:

  1. 45米
  2. 1 小时 45 分
  3. 1小时

现在我需要根据持续时间将其转换为事件开始和结束的日期。

我设法将这篇文章“星期一,上午 10:00”转换为即将到来的日期和时间,无论星期几,所以现在我有一个日期时间,让我们说“05/30/2022 10:00:00上午".

现在我需要通过添加例如前一个日期时间的“45m”。我不知道持续时间片段的格式,但它将是上面列表中的三个之一。

如何将其转换为标准时间跨度以添加到之前的时间?上述格式是否是一种标准格式,可能具有内置的解析方式?它来自 API.

我已经试过了,效果很好,但我不确定如何检测和处理格式。

\split the original string so now I have duration


\when I have just the hour duraton e.g. 1h
t = TimeSpan.ParseExact(durationString, "h\h", CultureInfo.InvariantCulture);
var finalDate = dt.Add(t);

\when I have just the minute format e.g. 45m

t = TimeSpan.ParseExact(durationString, "m\m", CultureInfo.InvariantCulture);

您可以使用 REGEX 检查匹配模式:

using System.Text.RegularExpressions;

            Regex HourOnly = new Regex("^[0-9]+h$");
            Regex MinuteOnly = new Regex("^[[0-9]+m");
            Regex HourAndMinute = new Regex("^[0-9]+h[0-9]+m$");

            List<string> conditions = new List<string>();
            string Condition1 = "Monday,10:00 AM,45m";
            string Condition2 = "Monday,10:00 AM,1h45m";
            string Condition3 = "Monday,10:00 AM,1h";
            conditions.Add(Condition1);
            conditions.Add(Condition2);
            conditions.Add(Condition3);

            foreach(string condition in conditions)
            {
                if (HourOnly.IsMatch(condition.Split(',').Last()))
                {
                    Console.WriteLine($"Hour only: {condition}");

                }
                else if (HourAndMinute.IsMatch(condition.Split(',').Last()))
                {
                    Console.WriteLine($"Hour and minute: {condition}");

                }
                else if (MinuteOnly.IsMatch(condition.Split(',').Last()))
                {
                    Console.WriteLine($"Minute only: {condition}");

                }
            }

授权用户可以输入 99999h99999m,但如果您有理由确定这不会发生,上述正则表达式应该适合您。

这里有一些额外的文档可以帮助您完成任务:https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

使用接受格式数组的 ParseExact 方法重载。

var values = new string[] { "45m", "1h45m", "1h" };
var formats = new string[] { @"m\m", @"h\hm\m", @"h\h" };

foreach (var value in values)
{
    var ts = TimeSpan.ParseExact(value, formats, CultureInfo.InvariantCulture);
    Console.WriteLine(ts);
}