解析带有可选减号的 TimeSpan

问题描述 投票:0回答:3

MSDN 说

styles参数影响使用自定义格式字符串解析的字符串的解释。它确定是否仅当存在负号时才将输入解释为负时间间隔 (TimeSpanStyles.None),或者是否始终将其解释为负时间间隔 (TimeSpanStyles.AssumeNegative)。如果未使用 TimeSpanStyles.AssumeNegative,则格式必须包含字面负号符号(例如“-”)才能成功解析负时间间隔。

我尝试过以下方法:

TimeSpan.ParseExact("-0700", @"\-hhmm", null, TimeSpanStyles.None)

但是它返回 07:00:00。对于“0700”失败。

如果我尝试:

TimeSpan.ParseExact("-0700", "hhmm", null, TimeSpanStyles.None)

也失败了。

TimeSpan.ParseExact("0700", new string [] { "hhmm", @"\-hhmm" }, null, TimeSpanStyles.None)

“0700”和“-0700”都不会失败,但始终返回正值 07:00:00。

应该如何使用?

c# .net timespan
3个回答
4
投票

看起来像这样不受支持。从自定义 TimeSpan 格式字符串页面:

自定义

TimeSpan
格式说明符也不包含使您能够区分负时间间隔和正时间间隔的符号。要包含符号,您必须使用条件逻辑构造格式字符串。其他角色部分包含一个示例。

这看起来确实很奇怪。恶心。

正如我的评论中提到的,您可以使用我的 Noda Time 项目的

Duration
解析;对于这种情况来说太过分了,但是如果您在项目中还有其他日期/时间工作,它可能会很有用。

例如:

var pattern = DurationPattern.CreateWithInvariantCulture("-hhmm");
var timeSpan = pattern.Parse("-0700").Value.ToTimeSpan();

3
投票

看起来你确实需要烦人地检查一下自己是否以前导开头

-

// tsPos = 07:00:00
string pos = "0700";
TimeSpan tsPos = TimeSpan.ParseExact(pos, new string [] { "hhmm", @"\-hhmm" }, null,
    pos[0] == '-' ? TimeSpanStyles.AssumeNegative : TimeSpanStyles.None);

// tsNeg = -07:00:00            
string neg = "-0700";
TimeSpan tsNeg = TimeSpan.ParseExact(neg, new string [] { "hhmm", @"\-hhmm" }, null,
    neg[0] == '-' ? TimeSpanStyles.AssumeNegative : TimeSpanStyles.None);

0
投票

您可以添加“:”分隔符并使用“c”格式(带有可选的减号支持):

public static TimeSpan FromTz(string str)
{
    var separatorPos = str.Length - 2;
    str = $"{str.Substring(0, separatorPos)}:{str.Substring(separatorPos)}";
    return TimeSpan.ParseExact(str, "c", CultureInfo.InvariantCulture);
}
© www.soinside.com 2019 - 2024. All rights reserved.