var timeSpan = new TimeSpan(10,130,10);
执行上述行后,通常timeSpan
的值格式为12:10:10
我是否有机会获得10:130:10
的价值(即没有格式化)?我需要它来处理危急情况。
答案 0 :(得分:3)
我认为在定义10:130:10
构造函数后,有一种方法可以获得TimeSpan
。并且没有理由让他们保持10小时+ 130分钟+ 10秒等于12:10:10
我们都知道。这是一个时间间隔,不是单独保留时间组件。
来自TimeSpan(Int32, Int32, Int32)
constructor;
指定的小时,分钟和秒将转换为刻度线,和 该值初始化此实例。
让我们看看这个构造函数是如何定义的;
public TimeSpan(int hours, int minutes, int seconds)
{
_ticks = TimeToTicks(hours, minutes, seconds);
}
这就是TimeToTicks
方法实现的方式;
internal static long TimeToTicks(int hour, int minute, int second)
{
long totalSeconds = (long)hour * 3600 + (long)minute * 60 + (long)second;
if (totalSeconds > MaxSeconds || totalSeconds < MinSeconds)
throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("Overflow_TimeSpanTooLong"));
return totalSeconds * TicksPerSecond;
}
如您所见,此方法不保留构造函数参数(hours
,minute
或second
)。它只是从totalseconds
值计算hours * 3600 + minute * 60 + second
。
答案 1 :(得分:2)
TimeSpan
并非如此。它表示经过的持续时间,而不是单个时间组件。有关详细信息,请参阅Soner's excellent answer。
如果您希望保持&#34; 10小时,130分钟,10秒和#34;作为单独的信息,您应该考虑ISO-8601 duration format。作为字符串,该值看起来像"PT10H130M10S"
。
在.NET中,您可以使用Noda Time库中的Period
类型来处理这些值。
要创建单个部分期间,您可以利用Period.FromMonths(3)
之类的简单工厂方法。但要创建多部分时段,您需要执行以下方法之一:
您可以使用PeriodBuilder
根据各个变量构建句点:
PeriodBuilder builder = new PeriodBuilder();
builder.Hours = 10;
builder.Minutes = 130;
builder.Seconds = 10;
Period period = builder.Build();
string s = period.ToString();
Debug.WriteLine(s); // "PT10H130M10S"
您可以使用PeriodPattern
从ISO-8601持续时间字符串中解析句点。特别是,下面显示的RoundtripPattern
将保留与最初提供的部件完全相同的部件:
string s = "PT10H130M10S";
PeriodPattern pattern = PeriodPattern.RoundtripPattern;
ParseResult<Period> result = pattern.Parse(s);
if (result.Success)
{
Period p = result.Value;
Debug.WriteLine(p.Hours); // 10
Debug.WriteLine(p.Minutes); // 130
Debug.WriteLine(p.Seconds); // 10
}