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。
应该如何使用?
它看起来像这样不受支持。从自定义 TimeSpan 格式字符串页面:
自定义
格式说明符也不包含使您能够区分负时间间隔和正时间间隔的符号。要包含符号,您必须使用条件逻辑构造格式字符串。其他角色部分包含一个示例。TimeSpan
这看起来确实很奇怪。恶心。
正如我的评论中提到的,您可以使用我的 Noda Time 项目的
Duration
解析;对于这种情况来说太过分了,但是如果您在项目中还有其他日期/时间工作,它可能会很有用。
例如:
var pattern = DurationPattern.CreateWithInvariantCulture("-hhmm");
var timeSpan = pattern.Parse("-0700").Value.ToTimeSpan();
看起来你确实需要烦人地检查一下自己是否以前导开头
-
// 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);
您可以添加“:”分隔符并使用“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);
}