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?

では、2 つの日付を比較して 60 日以上経過しているかどうかを確認するにはどうすればよいでしょうか。ありがとう、

4

4 に答える 4

4

次のようにする必要があります。

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

これの利点は、トライアルの有効期限が切れていない場合に、トライアルがどのくらい進んでいるかを伝えることができることです (経過.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();

それには2つの問題があります。最初にDateTime.Today、ローカルの日付/時刻が返されます。現地時間には一貫性がないため、いかなる種類の計算にも決して現地の日付/時間を使用しないでください。夏時間の変化、タイム ゾーンの移動はすべて、このプロパティによって返される現地時間に影響します。代わりに使用する必要がDateTime.UtcNow.Dateあるのは、前述の問題のいずれにも影響されないグローバル クロックである現在の UTC 時刻を取得することです。

2番目の問題はToShortDateString方法です。現在のカルチャを使用して日付/時刻を変換します。世界の他の地域では、日付は「DD/MM/YYYY」または「YYYY-MM-DD」として報告されていることをご存知ですか? ユーザーが現在のロケールを変更するとどうなりますか? これらの問題を回避するには、ToString(CultureInfo.InvariantCulture)メソッドを使用する必要があります。

最初の実行日をシリアル化する正しいコードは次のとおりです。

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

DateTime now = DateTime.Today.ToShortDateString(); // なぜこれを行うのか?

2 つの日付の差を計算するには、まずその 2 つの日付を取得する必要があります。1 つ目は保存された最初の実行日で、2 つ目は今日です。最初の実行日を DateTime 構造に逆シリアル化することで、最初の部分を実行しました。2番目の部分では、現在の日付が必要なだけです。文字列にシリアル化する必要はありません。そう

DateTime today = DateTime.UtcNow.Date;

2 つの日付が表示されたので、実際に差額を取得する方法についてさまざまなオプションがあります。他の答えはどれもその部分をうまくやっています。私は個人的にティモシー・ウォルターズの答えが好きです.それはあなたに試用期間を与えるという素晴らしい副作用があるからです. 次のようになります。

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 に答える