ISO 8601 是一种国际标准,用于表示日期和时间。ISO 8601 时间间隔(TimeSpan)格式通常表示为 PnYnMnDTnHnMn.nS
,其中:
P
表示时间段nY
表示年数nM
表示月数nD
表示天数T
表示时间部分nH
表示小时数nM
表示分钟数n.nS
表示秒数(小数部分)C# 中的 TimeSpan
结构体用于表示时间间隔,包含天数、小时数、分钟数、秒数和毫秒数。
将 ISO 8601 时间间隔转换为 C# TimeSpan
的优势在于:
TimeSpan
提供了方便的方法来处理这些时间间隔。P1DT2H30M
。Days
, Hours
, Minutes
, Seconds
, Milliseconds
等属性。在处理日期和时间数据时,特别是在需要跨平台或跨系统交换数据的情况下,使用 ISO 8601 格式并将其转换为 C# TimeSpan
是非常常见的。
以下是将 ISO 8601 时间间隔转换为 C# TimeSpan
的示例代码:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
string iso8601TimeSpan = "P1DT2H30M";
TimeSpan result = ParseIso8601TimeSpan(iso8601TimeSpan);
Console.WriteLine($"Days: {result.Days}");
Console.WriteLine($"Hours: {result.Hours}");
Console.WriteLine($"Minutes: {result.Minutes}");
Console.WriteLine($"Seconds: {result.Seconds}");
Console.WriteLine($"Milliseconds: {result.Milliseconds}");
}
public static TimeSpan ParseIso8601TimeSpan(string iso8601TimeSpan)
{
if (string.IsNullOrEmpty(iso8601TimeSpan))
throw new ArgumentException("ISO 8601 TimeSpan string cannot be null or empty.");
// Remove the 'P' and 'T' characters
string[] parts = iso8601TimeSpan.Replace("P", "").Replace("T", "").Split(new char[] { 'D', 'H', 'M', 'S' }, StringSplitOptions.RemoveEmptyEntries);
int days = 0, hours = 0, minutes = 0, seconds = 0;
foreach (string part in parts)
{
if (part.EndsWith("D"))
{
days = int.Parse(part.Replace("D", ""));
}
else if (part.EndsWith("H"))
{
hours = int.Parse(part.Replace("H", ""));
}
else if (part.EndsWith("M"))
{
minutes = int.Parse(part.Replace("M", ""));
}
else if (part.EndsWith("S"))
{
seconds = int.Parse(part.Replace("S", ""));
}
}
return new TimeSpan(days, hours, minutes, seconds);
}
}
问题1:输入的 ISO 8601 时间间隔格式不正确
public static bool IsValidIso8601TimeSpan(string iso8601TimeSpan)
{
if (string.IsNullOrEmpty(iso8601TimeSpan))
return false;
var regex = new System.Text.RegularExpressions.Regex(@"^P(\d+D)?(T(\d+H)?(\d+M)?(\d+(\.\d+)S)?)?$");
return regex.IsMatch(iso8601TimeSpan);
}
问题2:解析过程中出现数字格式错误
int.Parse
或 double.Parse
进行转换,并捕获可能的异常。try
{
days = int.Parse(part.Replace("D", ""));
}
catch (FormatException)
{
throw new FormatException("Invalid format for days in ISO 8601 TimeSpan.");
}
通过以上方法,可以有效地将 ISO 8601 时间间隔转换为 C# TimeSpan
,并处理常见的解析问题。
领取专属 10元无门槛券
手把手带您无忧上云