Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不设置格式的情况下返回TimeSpan?_C#_Formatting_Timespan - Fatal编程技术网

C# 如何在不设置格式的情况下返回TimeSpan?

C# 如何在不设置格式的情况下返回TimeSpan?,c#,formatting,timespan,C#,Formatting,Timespan,执行上述行后,timeSpan的值通常格式为12:10:10 是否有可能将值设置为10:130:10(即无格式)?在紧急情况下我需要它。我不相信在定义了TimeSpan构造函数之后,你会得到10:130:10。没有理由保留它们,因为我们都知道,10小时+130分钟+10秒等于12:10:10。它是一个时间间隔,不单独保留时间组件 来自 指定的小时、分钟和秒将转换为刻度,和 该值初始化此实例 让我们看看这个构造函数是如何定义的 var timeSpan = new TimeSpan(10,130,

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


是否有可能将值设置为
10:130:10
(即无格式)?在紧急情况下我需要它。

我不相信在定义了
TimeSpan
构造函数之后,你会得到
10:130:10
。没有理由保留它们,因为我们都知道,10小时+130分钟+10秒等于
12:10:10
。它是一个时间间隔,不单独保留时间组件

来自

指定的小时、分钟和秒将转换为刻度,和 该值初始化此实例

让我们看看这个构造函数是如何定义的

var timeSpan = new TimeSpan(10,130,10);
这就是
TimeToTicks
方法的实现方式

public TimeSpan(int hours, int minutes, int seconds)
{
    _ticks = TimeToTicks(hours, minutes, seconds);
}
内部静态长时间时钟(整数小时、整数分钟、整数秒)
{
长总秒=(长)小时*3600+(长)分*60+(长)秒;
如果(totalSeconds>MaxSeconds | | totalSeconds

如您所见,此方法不保留构造函数参数(
hours
minute
second
)。它只是从
hours*3600+minute*60+second
值计算
totalseconds

TimeSpan
不是这样工作的。它表示经过的持续时间,而不是单个时间组件。有关更多详细信息,请参阅

如果你想保持“10小时,130分钟,10秒”作为单独的信息,那么你应该考虑。作为一个字符串,该值看起来像
“PT10H130M10S”

在.NET中,您可以使用库中的
Period
类型来处理这些类型的值

要创建单个零件周期,您可以利用简单的工厂方法,如
period.FromMonths(3)
。但要创建多部分期间,您需要执行以下方法之一:

  • 您可以使用
    PeriodBuilder
    从各个变量构建周期:

    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;
    }
    
  • 您可以使用
    PeriodPattern
    解析ISO-8601持续时间字符串中的句点。特别是,下图所示的
    RoundtripPattern
    将保持零件与最初提供的零件完全相同:

    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"
    
    string s=“PT10H130M10S”;
    PeriodPattern=PeriodPattern.RoundtripPattern;
    ParseResult=pattern.Parse;
    如果(结果、成功)
    {
    周期p=结果值;
    Debug.WriteLine(p.Hours);//10
    Debug.WriteLine(p.Minutes);/130
    Debug.WriteLine(p.Seconds);//10
    }
    

“我在危急情况下需要它。”-这听起来很重要,但对你的问题没有帮助。你考虑过用你需要的三个属性编写你自己的类吗?CodeCaster我会试试..谢谢,我只是想知道,我的需求有没有已经定义的可能性..现在我对Soner的答案很清楚...)认识马特真好。在这种情况下,
Period.FromHours
返回
10
Period.FromMinutes
返回
130
值?以及如何在
期间
类中传递
“PT10H130M10S”
字符串?我找不到任何
Period
构造函数将
string
作为野田时间文档中的参数。@SonerGönül-有关多部分
Period
的一些示例用法,请参阅更新。干杯谢谢你,马特。例子看起来不错。
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
}