使用可空的DateTime

时间:2011-06-17 07:02:53

标签: c# datetime formatting

我正在使用LINQ,并且有一些DateTime属性?类型。

如果我现在想要从文本框中添加值,我似乎无法使其工作。

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ScoringLastUpgrade", DbType="Date")]
public System.Nullable<System.DateTime> ScoringLastUpgrade

我使用的文本框我用javascript确定格式为'2011-06-17'

但是现在当我尝试这样做时:

myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text).ToShortDateString();

我收到此错误:“无法将类型字符串转换为DateTime?”

怎么做?

4 个答案:

答案 0 :(得分:3)

.ToShortDateString()调用正在将其转换为字符串。你应该删除那个电话。

另外,你说你已经确定了javascript的格式。如果用户没有javascript,你也应该进行服务器端检查。此外,由于它采用给定格式,因此您可以使用DateTime.ParseExactDateTime.TryParseExact(因此无效格式不会引发异常),因为它更有效。 (格式字符串将是"yyyy-MM-dd")我相信。

答案 1 :(得分:2)

不要使用'ToShortDateTimeString'将其转换为字符串,只需设置Convert.ToDateTime的结果:

myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text);

假设您已对txtScoringUpgradeDate.Text进行了充分的验证?

我在处理这些类型转换时的偏好是使用TryParse方法,例如:

DateTime date;
if (DateTime.TryParse(txtScoringUpgradeDate.Text, out date))
    myObject.ScoringLastUpgrade = date;

Convert.ToDateTime与显式DateTime.Parse非常相似,会在出现异常值时抛出InvalidCastException。最好让你的代码容错,然后抓住异常。

更新:根据您的上次评论:

在这种情况下,您不应该返回DateTime.MinValue,因为MinValue小于datetime列支持的最小值。 CLR DateTime支持的日期范围低至0000-01-01,而SQL datetime(以及比较CLR SqlDateTime类型)支持的最小值为1753-01- 01。由于它是可空的DateTime,您应该将其设置为null:

public static DateTime? ToNullableDateTime(this string date)
{
    DateTime dateTime;
    return (DateTime.TryParse(date, out dateTime))
        ? (DateTime?)dateTime
        : null;
}

答案 2 :(得分:0)

问题是您已将ToShortDateString()放在那里,有效地将DateTime再次转换回string。尝试删除该部分行。

答案 3 :(得分:0)

在我的情况下(.cshtml):

<td>@item.InvoiceDate.Value.ToShortDateString().ToString()</td>

InvoiceDtae在DB

中是可为空的日期