如何通过比较DateTime来确定它是否已经过了60天?

时间:2013-05-16 02:41:54

标签: c# datetime

要在用户首次运行应用程序时向我的应用程序提供TRIAL期间,我将保存FirstRunTime,如下所示:

string sFirstRunDate = DateTime.Today.ToShortDateString();
saveInfo.saveFirstRun(sFirstRunDate );  // saves as a string to a text file

现在,每次运行应用程序时,我都希望看到它是否超过60天,如果是这样,则终止(仅限60天试用)。我该怎么做呢?

string sFirstRunDate = saveInfo.getFirstRun();   // returns the string I saved earlier
DateTime dtFirstRunDate = DateTime.Parse(sFirstRunDate);  // makes it a DateTime
DateTime now = DateTime.Today.ToShortDateString();   // why am I doing this?

那么我该如何处理这两个日期并进行比较,以确定它是否超过60天? 谢谢,

4 个答案:

答案 0 :(得分:4)

以下应该这样做:

var elapsed = DateTime.Today.Subtract(dtFirstRunDate);
if (elapsed.TotalDays > 60)
{
    // trial expired
}

这样做的好处是,当试验未到期时,你可以告诉他们他们在试验中的进展程度(使用过去的.TotalDays)。

答案 1 :(得分:2)

    TimeSpan t = DateTime.Now.Subtract(dtFirstRunDate);
    if (t.Days > 60)
    {
        //do something
    }

答案 2 :(得分:1)

尝试

if(DateTime.Parse(sFirstRunDate).AddDays(60) < DateTime.Now) {
    // trial has expired
}

这只需要第一次运行,增加60天,如果当前时间大于首次运行时间+ 60天,则试用结束。

答案 3 :(得分:0)

所有其他答案在技术上都适用于您,但它们在更大范围内是错误的。请进一步阅读。

  

//为什么我这样做?

这告诉我你没有完全掌握你想要应用的概念。我们一个接一个地去。

  

string sFirstRunDate = DateTime.Today.ToShortDateString();

这有两个问题。首先DateTime.Today返回本地日期/时间。 从不使用本地日期/时间进行任何类型的计算,因为当地时间不一致。日光更改,穿越时区,都会影响此属性返回的本地时间。您应该使用DateTime.UtcNow.Date来获取当前UTC时间,该时间是不受任何上述问题影响的全局时钟。

第二个问题是ToShortDateString方法。它使用当前文化转换日期/时间。您是否知道在世界其他地方,日期报告为“DD / MM / YYYY”或“YYYY-MM-DD”?如果用户更改当前区域设置会发生什么?要避免这些问题,您应该使用ToString(CultureInfo.InvariantCulture)方法。

序列化第一个运行日期的正确代码是

string sFirstRunDate = DateTime.UtcNow.Date.ToString(CultureInfo.InvariantCulture);
  

DateTime now = DateTime.Today.ToShortDateString(); //为什么我这样做?

要计算两个日期之间的差异,首先需要获取这两个日期。第一个是保存的第一个运行日期,第二个是今天。您通过将第一个运行日期反序列化为DateTime结构来完成第一部分。对于第二部分,您只需要当前日期,您不需要将其序列化为字符串。所以

DateTime today = DateTime.UtcNow.Date;

现在你有两个日期,你有一系列关于如何实际获得差异的选项。任何其他答案都可以做到这一点。我个人喜欢Timothy Walters'回答,因为它有一个很好的副作用,就是给你留下审判的日子。它看起来像:

DateTime dtFirstRunDate = DateTime.Parse(saveInfo.getFirstRun());
DateTime today = DateTime.UtcNow.Date;
var elapsed = today.Subtract(dtFirstRunDate);
if (elapsed.TotalDays > 60)
{
    // trial expired
}