2015-01-15 1 views
6

MSDN says:Синтаксический TimeSpan с дополнительным знаком минус

В стилей параметр влияет на интерпретацию строк проанализированных с использованием строк пользовательского формата. Он определяет, интерпретируется ли вход как отрицательный интервал времени, только если присутствует отрицательный знак (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.

Как это предполагается использовать?

+1

В качестве обходного пути, если вы не можете получить эту работу , вы можете разобрать «Длительность» в [Время Noda] (http://nodatime.org). Посмотрите, что я могу сделать с 'TimeSpan', хотя ... –

+0

Спасибо за подсказку. Но это простой сценарий, который я не хочу, и дополнительную библиотеку, вместо этого я бы предпочел использовать StartsWith ('-'). –

+0

Достаточно честный. Я все равно включил его в свой ответ, но в основном ради других читателей. –

ответ

3

Это выглядит как это не поддерживается. Из custom TimeSpan format strings страницы:

Пользовательские TimeSpan спецификаторы формата также не включают в себя символ знака, который позволяет различать между отрицательными и положительными интервалами времени. Чтобы включить знак знака, вы должны построить строку формата, используя условную логику. В разделе «Другие символы» приведен пример.

Это действительно странно. Ик.

Как уже упоминалось в моем комментарии, вы можете использовать мой Noda Time проект Duration parsing; overkill для этого случая, но если бы у вас была другая дата/время работы в проекте, это может быть полезно.

Например:

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

Итак, параметр 'styles' бесполезен. Можно просто добавить знак '-' впереди? –

+0

@TN: Несколько бесполезно, да. Вся функция кажется немного недооцененной, если честно ... (я имею в виду, что стиль имеет эффект, но не ужасно полезный - по крайней мере, для пользовательских шаблонов. Может быть, это лучше для стандартных шаблонов ...) –

+0

И будет ли пример выше работать с '7000'? –

0

Это выглядит как вам досадно нужно, чтобы проверить себя, если она начинается с ведущего -

// 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);