无法将类型 'System.TimeSpan' 的对象转换为类型 'System.IConvertible'

Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'

我的 SQL 数据库列 aeStarttime(0)(以 24 小时格式保存时间),例如:10:48:0015:28:00, 16:32:00

我正在尝试以 hh:mm tt 格式(am/pm 格式)

listView 控件上显示它
    <ItemTemplate>
        <asp:Label ID="lblStart" runat="server" 
          Text='<%# Convert.ToDateTime(Eval("aeStart")).ToShortTimeString() %>' />
    </ItemTemplate>

我得到一个错误:

Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'.

如果我尝试:

Text='<%# Eval("aeStart", "{0:HH:mm tt}") %>'

我得到:

Input string was not in a correct format.

如果我这样做:

Text='<%# Eval("aeStart") %>'

我会得到类似的东西

10:48:00 or 15:25:00

这不是我想要的。

I want 10:48 am or 3:25 pm

如何解决这个问题,我希望时间以 12 小时格式显示在标签上 am/pm(最好使用 .aspx 文件中的所有代码,而不是隐藏在代码中)

答案:

<asp:Label ID="lblStart" runat="server" Text='<%# DateTime.ParseExact(Eval("aeStart").ToString(), "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture).ToShortTimeString() %>' />

TimeSpan 外,Convert.ToDateTime 没有重载。仔细阅读 here

解决此问题的方法是做一些完全不同的事情,因为该方法没有重载来执行此操作。以下是您如何以另一种方式获得时间:

TimeSpan timespan = new TimeSpan(your time span value);
DateTime time = DateTime.Today.Add(timespan);
string displayTime = time.ToString("hh:mm:ss");

假设aeStart是一个TimeSpan,那么带"tt"的格式串是错误的。 'tt',AM/PM 指示符,对 DateTime NOTTimeSpan.

有效

尝试使用 TimeSpan.ToSting(String)

timeSpan.ToString("hh\:mm\:ss")

AM/PM 的想法对于一般意义上的时间跨度没有真正意义。该时间跨度是发生在上午、下午还是在它们之间拆分是特定于您的应用程序上下文的元数据。您可以添加额外的 string.Format 或类似的三元逻辑来确定时间跨度属于一天中的哪一部分。

问题是:您的时间 10:48:00 与模式 HH:mm tt 不匹配。您应该改用此模式:HH:mm:ss.

我用这段代码测试了它:

    string time = "10:48:00";
    DateTime dateTime = DateTime.ParseExact(time, "HH:mm:ss", CultureInfo.InvariantCulture);
    Console.WriteLine(dateTime.ToShortTimeString());

因此,根据您的情况,解决方案应该是:

<asp:Label ID="lblStart" runat="server" Text="<%# DateTime.ParseExact(Eval("aeStart").ToString(), "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture).ToShortTimeString() %>"/>