如何在没有格式化的情况下返回TimeSpan?

时间:2014-03-22 10:10:27

标签: c# formatting timespan

var timeSpan = new TimeSpan(10,130,10);

执行上述行后,通常timeSpan的值格式为12:10:10

我是否有机会获得10:130:10的价值(即没有格式化)?我需要它来处理危急情况。

2 个答案:

答案 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;
}

如您所见,此方法不保留构造函数参数(hoursminutesecond)。它只是从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
    }
    
相关问题