要在用户首次运行应用程序时向我的应用程序提供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天? 谢谢,
答案 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
}