DateTime.MaxValue.Ticks传递给构造函数时更改

时间:2014-06-16 20:15:01

标签: c# datetime

我正在尝试将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
}

有什么想法吗?

4 个答案:

答案 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;]));

正如其他人所说:

  • 尝试Nullable而不是MaxValue。您可能会遇到不同时区和区域设置的问题,甚至没有意识到(例如,当您的代码在不同的计算机上运行时)。
  • 考虑使用DateTimeOffset代替DateTime,因为它代表的是“瞬时时间”。而不是日历时间&#39;。有关详细信息,请参阅here。 (你理想情况下仍然使用Nullable。)

答案 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类型。无需再做那项工作。