我有一个逻辑,可以执行以下操作:
string myData = Convert.ToDateTime(Info.ClosedDate) == DateTime.MinValue ? String.Empty : "(" + Info.ClosedDate + ")";
,如果未作为数据库中的null存储,则应在括号中返回封闭状态。否则,它应该返回一个空字符串。
Convert.ToDateTime(Info.ClosedDate)
的值是01/01/1900
,DateTime.MinValue
的值是1/1/0001 12:00:00 AM
因此,条件永远不会返回String.Empty
当前对象中的字段表示为:
public string ClosedDate
{
get { return _ClosedDate; }
set { _ClosedDate = value; }
}
最好的解决方案是什么?
不存储或模型DateTime
类型为string
。
这适用于数据存储,也适用于代码中的模型。如果在数据库中可以将其无效,而不是模型为Nullable<DateTime>
(替代符号DateTime?
)。通常在最后一刻,通常在演示层中将其转换为string
。如果您这样做,则在阅读/写入数据存储时无需进行任何类型的转换。您还避免了对价值解释的歧义(就像什么值是null的,或者它本地化为" dd/mm/yyyy"或" mm/dd/yyyy" )。
private DateTime? _ClosedDate;
public DateTime? ClosedDate
{
get { return _ClosedDate; }
set { _ClosedDate = value; }
}
侧面注意:以上也可以建模为自动属性,但我没有这样做,因为尚不清楚模型中如何使用该字段
如果您不确定如何将DateTime
实例传递到ADO.NET查询作为本机格式中的参数,请查看以前的问题/答案:如何将用户供应的输入添加到SQL语句?
您可以与SqlDateTime.MinValue
Convert.ToDateTime(Info.ClosedDate) == SqlDateTime.MinValue? String.Empty : "(" + Info.ClosedDate + ")";
https://learn.microsoft.com/en-us/dotnet/api/system.data.sqltypes.sqldatetime.minvalue?
尽管最好将DateTime用作日期类型,但您的代码应该喜欢:
public DateTime ClosedDate
{
get; set;
}
您也可以使用此类自动属性或将其设置为要求的自动属性。
public DateTime ClosedDate
{
get;
set
{
Date = DateTime.Now;
}
}
对于字符串,您可以使用DateTime.Parse
或DateTime.ParseExact
而不是Convert.ToDateTime
。
如果值为null,则Parse
或ParseExact
返回ArgumentNullException
,并且如果值包含某种无效的日期格式,则返回FormatException
。
var convertedDate = DateTime.ParseExact(dateTime, "yyyyMMdd", CultureInfo.InvariantCulture);