我有一个可以为空的变量Start time
Timespan? st=e.StartTime;//Null-able variable;
我想以AM/PM
格式获得时间,但我无法得到它。
DateTime date = Convert.ToDateTime(st.ToString());
String f = String.Format("{0:hh:mm:tt}", date);
错误是:
System.FormatException: String was not recognized as a valid DateTime.
答案 0 :(得分:1)
如果要输出st.ToString()
的结果,您会发现它不包含任何日期信息,只有小时,分钟和秒。
这不是DateTime的有效格式,通常包含日期和时间信息。
您无需将TimeSpan转换为DateTime进行格式化,只需使用TimeSpan.ToString()
:
string f = st.Value.ToString(@"hh\:mm\:tt");
供参考:http://msdn.microsoft.com/en-us/library/ee372287.aspx
另外,请注意\
之前的:
,如果要在输出中包含文字字符串,则必须执行此操作,如文档页面底部所述。
答案 1 :(得分:0)
将时间跨度转换为日期是不可能的,时间跨度表示x分钟/小时/等等,并且您无法从单独的时间获得确切的日期。如果您有一个日期作为起点,您可以添加一个时间跨度,这将为您提供新的日期。
答案 2 :(得分:0)
st.ToString()
将返回"System.Nullable<Timespan>"
,因为这是可空类型返回的内容 - 它不会覆盖默认的Object.ToString实现,因此返回类型名称。
如果你想要实际时间跨度的字符串,那么你需要做st.Value.ToString()
,但你应该首先检查是否为空(即st.HasValue == true
)
编辑:另请参阅@Sean's评论,了解如何在不转换为DateTime的情况下输出Timespan。
编辑:原来我有点不对 - st.ToString()不会返回上面的内容。所以看看肖恩的答案。
答案 3 :(得分:0)
首先通过将TimeSpan添加到基准日期00:00来将Timespan转换为Datetime。然后在该dateTime上获得12小时格式。
DateTime.Now.Date.Add(OpenTimeSpan).ToString(@"hh\:mm\:tt")
答案 4 :(得分:0)
接受的答案是错误的。
您无法返回TimeSpan的AM / PM,因为它仅与时间的长度有关,
不是 一天中的某个时间-使用名称“ TimeSpan ”。
首先转换为DateTime,然后再转换为String:
string sTimeOfDay = new DateTime().Add(st).ToString("hh:mm tt");
注意:如果您的TimeSpan可为空,那么您将需要添加条件逻辑来处理空值并传递ts.Value
而不是ts
:
string sTimeOfDay = (st == null ? null : new DateTime().Add(st.value).ToString("hh:mm tt") );