2009-11-03 6 views
20

Ich brauche meine Anwendung 30 Tage ab heute ablaufen, werde ich das aktuelle Datum in der Anwendung config.Wie überprüfe ich, ob die Anwendung abgelaufen ist? Es macht mir nichts aus, wenn der Benutzer die Uhr zurückstellt und die App funktioniert (zu blöd ein Benutzer, um das zu tun).C# 30 Tage ab heute Datum

if (appmode == "Trial") {    

      ???? 

      } 

Antwort

42
string dateInString = "01.10.2009"; 

DateTime startDate = DateTime.Parse(dateInString); 
DateTime expiryDate = startDate.AddDays(30); 
if (DateTime.Now > expiryDate) { 
    //... trial expired 
} 
+0

'DateTime expirationDate = new DateTime (startDate);' ist nicht erforderlich – Scoregraphic

+5

'DateTime expirationDate = startDate.AddDays (30);' wäre korrekt, denn 'expirydate.AddDays (30)' schreibt das Ergebnis in Nirvana. – Oliver

+0

Oliver, danke für Patch :) –

4
DateTime _expiryDate = DateTime.Now + TimeSpan.FromDays(30); 
13

One ich sicher beantworten können!

DateTime expiryDate = DateTime.Now.AddDays(30); 

Oder vielleicht - wenn Sie nur das Datum ohne Zeit angebracht wollen, die besser geeignet sein könnte:

DateTime expiryDate = DateTime.Today.AddDays(30); 
18

DateTime.AddDays das tut:

DateTime expires = yourDate.AddDays(30); 
+2

Vergessen Sie nicht, das Ergebnis zuzuweisen. Ich mache immer yourdate.AddDays (30) und frage mich dann, warum sich yourDate nicht geändert hat. –

+1

yourDate ändert sich jedoch nicht, es ist das Ablaufdatum, das in diesem Fall also in Ordnung ist. – James

+0

@Cameron: das ist, wo 'DateTime abläuft' Teil kommt in das Bild –

1

Eine bessere Lösung könnte sein, eine Lizenzdatei mit einem Zähler einzuführen. Schreiben Sie das Installationsdatum der Anwendung (während der Installation) in die Lizenzdatei. Dann jedes Mal wird die Anwendung ausgeführt Sie die Lizenzdatei bearbeiten und die Zählung erhöht um 1. Jedes Mal, wenn die Anwendung startet einfach eine schnelle Überprüfung, um zu sehen, ob die 30 Verwendungen der Anwendung hat also

if (LicenseFile.Counter == 30) 
    // go into expired mode 
erreicht

auch wird das Problem dadurch lösen, wenn der Benutzer den Systemtakt gesetzt hat zurück, wie Sie eine einfache Prüfung

if (LicenseFile.InstallationDate < SystemDate) 
    // go into expired mode (as punishment for trying to trick the app!) 

das Problem mit dem aktuellen Setup zu sagen, tun kann, ist der Benutzer jeden Tag um die Anwendung verwenden für 30 Tage, um ihre volle 30-Tage-Testversion zu erhalten.

+0

30 Tage ab Installationsdatum oder ab Datum der ersten Verwendung ist nicht ungewöhnlich oder unvernünftig. – Murph

+1

Ja, aber wie ich bereits erwähnt habe, müsstest du die Anwendung jeden Tag 30 Tage lang im Trab haben, um deine volle 30-Tage-Testversion zu bekommen. Die meisten Anwendungen heutzutage würden sicherstellen, dass Sie Ihre vollen 30 Tage erhalten, unabhängig davon, wann Sie die Anwendung zum ersten Mal verwendet oder installiert haben. – James

2

Eine mögliche Lösung wäre beim ersten Lauf, erstellen Sie eine Datei mit dem aktuellen Datum und legen Sie es in IsolatedStorage. Überprüfen Sie bei nachfolgenden Läufen den Inhalt der Datei und vergleichen Sie sie mit dem aktuellen Datum. Wenn die Datumsdifferenz mehr als 30 Tage beträgt, informieren Sie den Benutzer und schließen Sie die Anwendung.

+1

+1 isolierten Speicher in Aktion ... die Registrierung könnte auch ein anderer Kandidat sein, obwohl erfordert mehr Sicherheit als isolierte Speicher. – Ian

0

@Ed cortenay, @James, Ich habe eine dumme Frage. Wie kann man Benutzer von dieser Datei fernhalten (Datei mit Ablaufdatum). Wenn der Benutzer über Installationsrechte verfügt, hat der Benutzer offensichtlich auch Zugriff auf die Anzeige von Dateien. Ändern der Erweiterung der Datei wird nicht helfen. Also, wie man diese Datei sicher und weg von den Händen der Benutzer hält?

+0

Lösungen: Daten verschlüsseln und/oder Datei-Hash hinzufügen. Wenn die Datei beschädigt ist, betrachten Sie die Testversion als abgelaufen –

+0

Vielen Dank für die Beantwortung von Victor.Encrypting wird die Datei sicher unlesbar machen. – Shekhar

+0

DPAPI könnte nützlich sein? Insbesondere mit einer Anwendung unique salt und möglicherweise den Maschinenkontext anstelle des Benutzerkontexts verwenden (Wrapper in C# at System.Security.Cryptography.DataProtection) –

0

Sie müssen die erste Laufzeit des Programms speichern, um dies zu tun. Wie ich es wahrscheinlich machen würde, verwende ich die eingebauten Anwendungseinstellungen in Visual Studio. Machen Sie einen InstallDate, der eine Benutzereinstellung ist und standardmäßig DateTime.MinValue oder etwas Ähnliches (z. B. 1/1/1900).

Dann, wenn das Programm die Überprüfung ausgeführt wird, ist einfach:

if (appmode == "trial") 
{ 
    // If the FirstRunDate is MinValue, it's the first run, so set this value up 
    if (Properties.Settings.Default.FirstRunDate == DateTime.MinValue) 
    { 
    Properties.Settings.Default.FirstRunDate = DateTime.Now; 
    Properties.Settings.Default.Save(); 
    } 

    // Now check whether 30 days have passed since the first run date 
    if (Properties.Settings.Default.FirstRunDate.AddMonths(1) < DateTime.Now) 
    { 
    // Do whatever you want to do on expiry (exception message/shut down/etc.) 
    } 
} 

Benutzereinstellungen gespeichert sind, in einer ziemlich seltsamen Lage (so etwas wie C: \ Dokumente und Einstellungen \ Benutzername \ Lokale Einstellungen \ Anwendungsdaten), so es wird ziemlich schwer für den durchschnittlichen Joe sein, es trotzdem zu finden. Wenn Sie paranoid sein wollen, verschlüsseln Sie einfach das Datum, bevor Sie es in den Einstellungen speichern.

EDIT: Seufz, falsch gelesen die Frage, nicht so komplex wie ich dachte>.>

13

DateTime.Now.Add (-30)

30 Tage Gibt Ihnen das Datum jetzt sah in einem Teil einiger Websites, dass Code I

+0

Toller Punkt! Freut mich, das hier zu sehen. –

1
string[] servers = new string[] { 
     "nist1-ny.ustiming.org", 
     "nist1-nj.ustiming.org", 
     "nist1-pa.ustiming.org", 
     "time-a.nist.gov", 
     "time-b.nist.gov", 
     "nist1.aol-va.symmetricom.com", 
     "nist1.columbiacountyga.gov", 
     "nist1-chi.ustiming.org", 
     "nist.expertsmi.com", 
     "nist.netservicesgroup.com" 
     }; 
string dateStart, dateEnd; 

void SetDateToday() 
    { 
     Random rnd = new Random(); 
     DateTime result = new DateTime(); 
     int found = 0; 
     foreach (string server in servers.OrderBy(s => rnd.NextDouble()).Take(5)) 
     { 
      Console.Write("."); 
      try 
      { 
       string serverResponse = string.Empty; 
       using (var reader = new StreamReader(new System.Net.Sockets.TcpClient(server, 13).GetStream())) 
       { 
        serverResponse = reader.ReadToEnd(); 
        Console.WriteLine(serverResponse); 
       } 

       if (!string.IsNullOrEmpty(serverResponse)) 
       { 
        string[] tokens = serverResponse.Split(' '); 
        string[] date = tokens[1].Split(' '); 
        string time = tokens[2]; 
        string properTime; 

        dateStart = date[2] + "/" + date[0] + "/" + date[1]; 

        int month = Convert.ToInt16(date[0]), day = Convert.ToInt16(date[2]), year = Convert.ToInt16(date[1]); 
        day = day + 30; 
        if ((month % 2) == 0) 
        { 
         //MAX DAYS IS 30 
         if (day > 30) 
         { 
          day = day - 30; 
          month++; 
          if (month > 12) 
          { 
           month = 1; 
           year++; 
          } 
         } 
        } 
        else 
        { 
         //MAX DAYS IS 31 
         if (day > 31) 
         { 
          day = day - 31; 
          month++; 
          if (month > 12) 
          { 
           month = 1; 
           year++; 
          } 
         } 
        } 
        string sday, smonth; 
        if (day < 10) 
        { 
         sday = "0" + day; 
        } 
        if (month < 10) 
        { 
         smonth = "0" + month; 
        } 
        dateEnd = sday + "/" + smonth + "/" + year.ToString(); 

       } 

      } 
      catch 
      { 
       // Ignore exception and try the next server 
      } 
     } 
     if (found == 0) 
     { 
      MessageBox.Show(this, "Internet Connection is required to complete Registration. Please check your internet connection and try again.", "Not connected", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      Success = false; 
     } 
    } 

von hinten. Das obige Beispiel macht einen Fehler aus: Wenn Sie die aktuelle Uhrzeit und das Datum auf das Startdatum setzen, verlängert sich der Ablauf der Anwendung.

Die Lösung? Beziehen Sie sich auf einen Online-Zeitserver.

-2
if (cmb_mode_of_service.SelectedItem != null && cmb_term_of_service.SelectedItem != null) 
      { 
       if (cmb_mode_of_service.SelectedIndex > 0 && cmb_term_of_service.SelectedIndex > 0) 
       { 
        if (cmb_mode_of_service.SelectedItem.ToString() == "Single Service/Installation" || cmb_term_of_service.SelectedItem.ToString() == "Single Time") 
        { 
         int c2 = 1; 
         char c1 = 'A'; 
         DataRow dr = dt.NewRow(); 
         dr["SN"] = c2++; 
         dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
         dr["servicedate"] = service_start_date.Text; 
         dr["servicestatus"] = "Pending"; 
         dr["serviceexcutive"] = "Not Alowed"; 
         dt.Rows.Add(dr); 
         dataGridView1.DataSource = dt; 

         txtexpirydate.Text = (Convert.ToDateTime(service_start_date.Text).AddDays(1)).ToString(); 

        } 
        else 
        { 



         if (cmb_mode_of_service.SelectedItem.ToString() == "Weekly Service") 
         { 
          int year = 0; 
          if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
          { 
           year = 1; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
          { 
           year = 2; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
          { 
           year = 3; 
          } 

          DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
          DateTime Enddate = currentdate.AddYears(+year); 
          txtexpirydate.Text = Enddate.ToString(); 

          char c1 = 'A'; 
          int c2 = 1; 
          for (var dt1 = currentdate.AddDays(7); dt1 <= Enddate; dt1 = dt1.AddDays(7)) 
          { 
           DataRow dr = dt.NewRow(); 
           dr["SN"] = c2++; 
           dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
           dr["servicedate"] = dt1.ToString(); 
           dr["servicestatus"] = "Pending"; 
           dr["serviceexcutive"] = "Not Alowed"; 
           //txtexpirydate.Text = dt1.ToString(); 
           dt.Rows.Add(dr); 

          } 
          dataGridView1.DataSource = dt; 

         } 

         if (cmb_mode_of_service.SelectedItem.ToString() == "Fortnight Service") 
         { 
          int year = 0; 
          if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
          { 
           year = 1; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
          { 
           year = 2; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
          { 
           year = 3; 
          } 

          DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
          DateTime Enddate = currentdate.AddYears(+year); 
          txtexpirydate.Text = Enddate.ToString(); 

          char c1 = 'A'; 
          int c2 = 1; 
          for (var dt1 = currentdate.AddDays(15); dt1 <= Enddate; dt1 = dt1.AddDays(15)) 
          { 
           DataRow dr = dt.NewRow(); 
           dr["SN"] = c2++; 
           dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
           dr["servicedate"] = dt1.ToString(); 
           dr["servicestatus"] = "Pending"; 
           dr["serviceexcutive"] = "Not Alowed"; 
           // txtexpirydate.Text = dt1.ToString(); 
           dt.Rows.Add(dr); 

          } 
          dataGridView1.DataSource = dt; 

         } 

         if (cmb_mode_of_service.SelectedItem.ToString() == "Monthly Service") 
         { 
          int year = 0; 
          if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
          { 
           year = 1; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
          { 
           year = 2; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
          { 
           year = 3; 
          } 

          DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
          DateTime Enddate = currentdate.AddYears(+year); 
          txtexpirydate.Text = Enddate.ToString(); 

          char c1 = 'A'; 
          int c2 = 1; 
          for (var dt1 = currentdate.AddDays(30); dt1 <= Enddate; dt1 = dt1.AddDays(30)) 
          { 
           DataRow dr = dt.NewRow(); 
           dr["SN"] = c2++; 
           dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
           dr["servicedate"] = dt1.ToString(); 
           dr["servicestatus"] = "Pending"; 
           dr["serviceexcutive"] = "Not Alowed"; 
           // txtexpirydate.Text = dt1.ToString(); 
           dt.Rows.Add(dr); 

          } 
          dataGridView1.DataSource = dt; 

         } 


         if (cmb_mode_of_service.SelectedItem.ToString() == "Trimister Service") 
         { 
          int year = 0; 
          if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
          { 
           year = 1; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
          { 
           year = 2; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
          { 
           year = 3; 
          } 

          DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
          DateTime Enddate = currentdate.AddYears(+year); 
          txtexpirydate.Text = Enddate.ToString(); 

          char c1 = 'A'; 
          int c2 = 1; 
          for (var dt1 = currentdate.AddDays(90); dt1 <= Enddate; dt1 = dt1.AddDays(90)) 
          { 
           DataRow dr = dt.NewRow(); 
           dr["SN"] = c2++; 
           dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
           dr["servicedate"] = dt1.ToString(); 
           dr["servicestatus"] = "Pending"; 
           dr["serviceexcutive"] = "Not Alowed"; 
           // txtexpirydate.Text = dt1.ToString(); 
           dt.Rows.Add(dr); 

          } 
          dataGridView1.DataSource = dt; 

         } 

         if (cmb_mode_of_service.SelectedItem.ToString() == "Half Yearly Service") 
         { 
          int year = 0; 
          if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
          { 
           year = 1; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
          { 
           year = 2; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
          { 
           year = 3; 
          } 

          DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
          DateTime Enddate = currentdate.AddYears(+year); 
          txtexpirydate.Text = Enddate.ToString(); 

          char c1 = 'A'; 
          int c2 = 1; 
          for (var dt1 = currentdate.AddDays(180); dt1 <= Enddate; dt1 = dt1.AddDays(180)) 
          { 
           DataRow dr = dt.NewRow(); 
           dr["SN"] = c2++; 
           dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
           dr["servicedate"] = dt1.ToString(); 
           dr["servicestatus"] = "Pending"; 
           dr["serviceexcutive"] = "Not Alowed"; 
           // txtexpirydate.Text = dt1.ToString(); 
           dt.Rows.Add(dr); 

          } 
          dataGridView1.DataSource = dt; 

         } 

         if (cmb_mode_of_service.SelectedItem.ToString() == "Yearly Service") 
         { 
          int year = 0; 
          if (cmb_term_of_service.SelectedItem.ToString() == "One Year") 
          { 
           year = 1; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "Two Year") 
          { 
           year = 2; 
          } 

          if (cmb_term_of_service.SelectedItem.ToString() == "three year") 
          { 
           year = 3; 
          } 

          DateTime currentdate = Convert.ToDateTime(service_start_date.Text); 
          DateTime Enddate = currentdate.AddYears(+year); 
          txtexpirydate.Text = Enddate.ToString(); 

          char c1 = 'A'; 
          int c2 = 1; 
          for (var dt1 = currentdate.AddDays(365); dt1 <= Enddate; dt1 = dt1.AddDays(365)) 
          { 
           DataRow dr = dt.NewRow(); 
           dr["SN"] = c2++; 
           dr["serviceid"] = txt_service_id.Text + "-" + c1++; 
           dr["servicedate"] = dt1.ToString(); 
           dr["servicestatus"] = "Pending"; 
           dr["serviceexcutive"] = "Not Alowed"; 
           //txtexpirydate.Text = dt1.ToString(); 
           dt.Rows.Add(dr); 

          } 
          dataGridView1.DataSource = dt; 

         } 

        } 
       } 
+1

Wenn Sie wirklich denken, dass Ihr Codeblock etwas Bedeutungsvolles hinzufügt, was in anderen 10 Antworten noch nicht erwähnt wird, geben Sie bitte Erläuterungen an. Trotzdem sollten Erklärungen immer dem Code hier in StackOverflow folgen! – ZygD

Verwandte Themen