【问题标题】:Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'无法将“System.TimeSpan”类型的对象转换为“System.IConvertible”类型
【发布时间】:2015-12-17 15:46:40
【问题描述】:

我在我的 SQL 数据库列 aeStart 中有 time(0)(以 24 小时格式节省时间),例如:10:48:0015:28:0016:32:00

我正在尝试以hh:mm tt 格式(上午/下午格式)在listView 控件上显示它

    <ItemTemplate>
        <asp:Label ID="lblStart" runat="server" 
          Text='<%# Convert.ToDateTime(Eval("aeStart")).ToShortTimeString() %>' />
    </ItemTemplate>

我收到一个错误:

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

如果我尝试:

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

我明白了:

输入字符串的格式不正确。

如果我这样做:

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

我会得到类似的东西

10:48:00 或 15:25:00

这不是我想要的。

我想要上午 10:48 或下午 3:25

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

答案:

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

【问题讨论】:

  • 数据库中存储的日期时间是什么数据类型和格式?
  • @Mathemats, time(0) 如问题所述。
  • 那么为什么不使用DateTime呢?这不是你在那里的时间跨度。
  • 当时aeStart的值是多少?

标签: c# asp.net sql-server datetime webforms


【解决方案1】:

问题是:您的时间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() %>"/>

【讨论】:

  • Convert.ToDateTime(Eval("aeStart")).ToShortTimeString()改成DateTime.ParseExact("aeStart", "HH:mm:ss", CultureInfo.InvariantCulture).ToShortTimeString()怎么样?
  • 我收到了String was not recognized as a valid DateTime.
  • 能不能调试一下,看看当时字符串“aeStart”的值是多少?
  • 基本上我得到了一个异常,我不知道如何查看值,我必须在观察列表中添加什么变量,我添加了lblStart标签但什么都没有
【解决方案2】:

尝试使用TimeSpan.ToSting(String)

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

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

【讨论】:

  • 不好,因为我只是直接评估它,它会显示 24 小时格式,我想要上午/下午的 12 小时格式
【解决方案3】:

Convert.ToDateTime 没有重载,TimeSpan 除外。阅读它here

解决这个问题的方法是做一些完全不同的事情,因为该方法没有重载来做到这一点。以下是您可以通过其他方式获得时间的方法:

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

【讨论】:

  • 这应该是评论,因为 OP 的问题是 How to fix 而不是为什么。
  • 修复的方法是不要尝试将 TimeSpan 转换为 DateTime,那么这个答案怎么错了?你无法解决这个问题,你可以完全做其他事情。
  • 我不是说它错了,我只是说它没有回答问题。另外,我没有否决您的回答。这是一个 +1 来证明这一点!
  • 对不起,菲利克斯,我只是讨厌人们这样做,我们每个人都在这里只是为了帮助和获得帮助,而我基本上只是想让这个人知道他做错了,但还有其他选择。
  • 我明白了。我刚刚发布了该评论,因为我预测即使您的回答基本上正确,也会出现反对票和标志,只是它没有直接回答问题。
【解决方案4】:

假设aeStartTimeSpan,那么带有“tt”的格式字符串是错误的。 'tt',AM/PM 指示符,对 DateTime 有效 NOT TimeSpan

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多