我正在尝试将DateTime.MaxValue
传递给构造函数,但由于某些原因传递时,Ticks
属性从315537897599999999
更改为3155378975990000000
,从而难以实现用于比较。
DateTime dt = DateTime.MaxValue; //here it is 315537897599999999
OfferSetting setting = new OfferSetting(settingCode
, (Equals(row["AccountId"], "")) ? null : row["AccountId"].ToString()
, (Equals(row["Arguments"], "")) ? null : row["Arguments"].ToString()
, (Equals(row["StartDate"], "") || Equals(row["StartDate"], DBNull.Value)) ? DateTime.MinValue : Convert.ToDateTime(row["StartDate"])
, (Equals(row["EndDate"], "") || Equals(row["StartDate"], DBNull.Value)) ? dt : Convert.ToDateTime(row["EndDate"]));
进入OfferSetting
的构造函数后,它会更改为3155378975990000000
:
public OfferSetting(SettingCode settingCode, string accountId, string arguments, DateTime startDate, DateTime endDate)
: base(MoeState.New)
{
this.Id = "-1";
this.OfferSettingId = "-1";
this.SettingCode = settingCode;
this.AccountId = accountId;
this.Arguments = arguments;
this.StartDate = startDate;
this.EndDate = endDate; //here it is 3155378975990000000
}
有什么想法吗?
答案 0 :(得分:1)
我有一个无重复 - 我只是尝试了它,并且不能让它重新制作。您需要进行调试,如果它变得简单,请重写代码以将行[" EndDate"]分配给变量(即使是暂时的),这样您至少可以看到该变量中的内容
仅供参考,在您的第二个条件下,您似乎正在测试行[&#34; EndDate&#34;]以及行[&#34; StartDate&#34;],这可能会导致问题。< / p>
(等于(行[&#34; EndDate&#34; ],&#34;&#34;)||等于(行[&#34; StartDate&#34 ; ],DBNull.Value))? dt:Convert.ToDateTime(row [&#34; EndDate&#34;]));
正如其他人所说:
答案 1 :(得分:0)
Nullable DateTime结构将命名为DateTime?例如
DateTime? ndt=null;
在戳实际值字段之前,您还需要检查是否(HasValue())。
if(ndt.HasValue()){/*do what you meant to */}
答案 2 :(得分:0)
我想通了,我只是个白痴,它将错误的值传递给构造函数。
答案 3 :(得分:0)
简单地通过构造函数参数传递值绝对不能更改该值,因此您可以消除它的那一部分。
精确丢失的可能性更大。当您将值存储到数据库中或者正在检索它时,可能会发生这种情况。
在存储方面,如果确实需要存储DateTime.MaxValue
的完整精度,请确保在数据库中使用可支持它的数据类型。例如,如果您使用的是SQL Server,则应使用datetime2
类型而不是datetime
类型。
在检索方面,你的一些代码似乎遭受了共同的反模式。
不要这样做:
DateTime dt = Convert.ToDateTime(row["yourfield"].ToString());
相反,请执行以下操作:
DateTime dt = (DateTime) row["yourfield"];
当您转换为字符串然后解析该字符串时,可能会丢失精度。此外,在某些情况下,特定于文化的格式或非Gregorian日历可能会受到阻碍。只需将其取消装箱,即可将其保留为原始类型。不需要任何字符串。
其他类型也是如此,包括整数,布尔值和字符串。底层数据库客户端已经从本机数据库类型转换为适当的.Net类型。无需再做那项工作。