他のすべての答えは技術的にはうまくいきますが、より大きなスケールでは間違っています。さらにお読みください。
// なぜこれを行うのか?
これは、適用しようとしている概念を完全に把握していないことを示しています。一つ一つ行きましょう。
文字列 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
}