2

为了在用户首次运行应用程序时为我的应用程序提供试用期,我将 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

4 回答 4

4

以下应该做到这一点:

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

这样做的好处是,当试用期尚未到期时,您可以告诉他们试用期有多远(使用 elapsed.TotalDays)。

于 2013-05-16T02:46:09.337 回答
2
    TimeSpan t = DateTime.Now.Subtract(dtFirstRunDate);
    if (t.Days > 60)
    {
        //do something
    }
于 2013-05-16T02:49:05.717 回答
1

尝试

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

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

于 2013-05-16T02:44:24.360 回答
0

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

// 我为什么要这样做?

这告诉我你并没有完全掌握你试图应用的概念。让我们一一来。

字符串 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.Today.ToShortDateString(); // 我为什么要这样做?

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

DateTime today = DateTime.UtcNow.Date;

既然您有两个日期,那么您就有了一系列关于如何实际获得差异的选项。其他任何答案都可以很好地完成该部分。我个人喜欢蒂莫西沃尔特斯的回答,因为它有一个很好的副作用,可以让你有审判的日子。它看起来像:

DateTime dtFirstRunDate = DateTime.Parse(saveInfo.getFirstRun());
DateTime today = DateTime.UtcNow.Date;
var elapsed = today.Subtract(dtFirstRunDate);
if (elapsed.TotalDays > 60)
{
    // trial expired
}
于 2013-05-16T03:20:42.030 回答