2013-12-17 82 views
3

我在将时间转换为12小时制时钟时遇到问题。以下代码在24小时时钟机器上正常工作。输入字符串格式不正确,无法解析DateTime

(new DisplayReminder(_name, _displayText, _snoozTime, TimeSpan.Parse(_startTime.ToShortTimeString(), CultureInfo.InvariantCulture))).Show(); 

TimeSpan.Parse(_startTime.ToShortTimeString()抛出exeception输入字符串中的格式不正确,我在这里试图获得一部分时间从DateTime值_startDate 在这个问题上有任何建议或解决方案。

+0

这可能是因为AM/PM的文字,这是不是真的适用于一个时间跨度,我想的。 – Patrick

回答

3

目前还不清楚是什么你“重新尝试做,但刚开一天的时间应不涉及字符串转换:

TimeSpan time = _stateTime.TimeOfDay; 

我强烈建议你避免字符串转换unle它们本质上是你试图实现的一部分。

就我个人而言,我不喜欢使用TimeSpan作为一天的时间,但这是您的BCL。你可能也想看看我的Noda Time库有更清晰的各种日期/时间概念的分离。

+0

BCL的意思是什么? –

+0

@AnkushMadankar:基础类库。基本上“开箱即用的.NET库”(不*严格*精确,但现在足够接近)。 –

+0

再次感谢知识渊博的回复,我查看了Noda Times图书馆,下载并使用它,但我无法正确使用它。但这个解决方案工作正常。 –

1

试试这个:

TimeSpan.ParseExact(
     _startTime.ToString("hh:mm:ss"), "hh:mm:ss", 
          System.Globalization.CultureInfo.InvariantCulture); 

将您的日期格式相同的格式为TimeSpan.ParseExact接受,所以它会在任何机器上运行(我假设_startTime是DateTime

0

我很确定它在24H时能正常工作,但在12H系统中压碎,因为“PM”“AM”部分!摆脱它,你将会很安全 11:54:33 PM和23:54:33有很大的不同在操控性方面

编辑 它可能不是最好的解决办法,但如果你把绳剪断的最后一个指标它的工作原理:

int index = _StartTime.IndexOf("M"); 
    if (index >= 0) 
{ 
_StartTime = _StartTime.Substring(0, index-1); 
switch (_StartTime.IndexOf("P")) 
case : -1 
_StartTime = _StartTime.Substring(0,_StartTime.Length); 
break; 

default: 
string hours = _startTime.Substring(_StartTime.Length-8,2); 
int H = Convert.ToInt32(hours); 
H += 12; 
string result = _StartTime.Substring(0, _StartTime.Length-8)+ Convert.ToString(H)+_startTime.Substring(_StartTime.Length-6); 

_StartTime = result; 
break; 
} 

这将引发AM/PM的时候,你可以在此 第二个编辑后,使用相同的前面的代码 这是最可怕的解决方案,但它的工作原理;)

+0

好吧,我现在有问题了,你可以建议解决方案吗? –

+0

@AnkushMadankar我的答案可以让你解析'AM/PM' timespans – wudzik

+0

@AnkushMadankar参见编辑 – chouaib

1

尝试

startTime.TimeOfDay.ToString() 
+1

什么?您已经有TimeOfDay的时间范围,为什么将它转换为字符串,然后将其转换回来,仅将其再次转换为字符串? – Patrick