将持续时间从 String 转换为 TimeSpan
Convert time duration from String to TimeSpan
我有一个包含星期几、时间和持续时间的字符串。例如。星期一, 10:00 AM, 45m
时长可以是以下格式之一:
- 45米
- 1 小时 45 分
- 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);
}
我有一个包含星期几、时间和持续时间的字符串。例如。星期一, 10:00 AM, 45m
时长可以是以下格式之一:
- 45米
- 1 小时 45 分
- 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);
}