2009-11-03 12 views
20

Potrzebuję mojej aplikacji do wygaśnięcia 30 dni od dzisiaj, będę przechowywać bieżącą datę w konfiguracji aplikacji. Jak sprawdzić, czy aplikacja wygasła? Nie mam nic przeciwko temu, że użytkownik zmienił zegar i aplikacja działa (zbyt głupi, aby to zrobić).C# 30 dni od dzisiejszej daty

if (appmode == "Trial") {    

      ???? 

      } 

Odpowiedz

42
string dateInString = "01.10.2009"; 

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

'DateTime expiryDate = new DateTime (startDate);' nie jest wymagany – Scoregraphic

+5

'DateTime expiryDate = startDate.AddDays (30);' byłby poprawny, ponieważ 'expiryDate.AddDays (30)' zapisze wynik w nirwanie. – Oliver

+0

Oliver, dzięki za łatkę :) –

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

Jedno mogę odpowiedzieć z ufnością!

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

Lub ewentualnie - jeśli chcesz tylko datę bez czasu załączonym co może być bardziej odpowiednie:

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

DateTime.AddDays robi:

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

Pamiętaj, aby pamiętać, aby przypisać wynik. Zawsze robię yourdate.AddDays (30), a następnie zastanawiam się, dlaczego YourDate się nie zmieniło. –

+1

yourDate się nie zmienia, jest to data ważności, która w tym przypadku jest OK. – James

+0

@Cameron: tam właśnie pojawia się część 'DateTime expires' –

1

Lepszym rozwiązaniem może być wprowadzenie pliku licencji z licznikiem. Zapisz w pliku licencji datę instalacji aplikacji (podczas instalacji). Wtedy za każdym uruchomieniu aplikacji można edytować plik licencji i zwiększamy licznik o 1. Za każdym razem aplikacja uruchamia się po prostu zrobić szybki test, aby sprawdzić, czy 30 zastosowania aplikacji został osiągnięty tj

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

również będzie to rozwiązać problem, jeśli użytkownik wprowadził zegar systemowy z powrotem, jak można zrobić prostą kontrolę powiedzieć

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

problem z aktualnej konfiguracji jest użytkownik będzie musiał użyć aplikacji codziennie przez 30 dni, aby uzyskać pełną 30-dniową wersję próbną.

+0

30 dni od daty instalacji lub od daty pierwszego użycia nie jest wcale rzadkie lub nieuzasadnione. – Murph

+1

Tak, ale jak już wspomniałem, będziesz musiał użyć aplikacji codziennie przez 30 dni w kłusie, aby uzyskać pełną 30-dniową wersję próbną. Większość aplikacji zapewnia obecnie pełne 30 dni niezależnie od tego, kiedy po raz pierwszy używał/instalował aplikację. – James

2

Możliwe rozwiązanie byłoby przy pierwszym uruchomieniu, utwórz plik zawierający aktualną datę i umieść go w IsolatedStorage. W przypadku kolejnych uruchomień sprawdź zawartość pliku i porównaj z bieżącą datą; jeśli różnica jest większa niż 30 dni, poinformuj użytkownika i zamknij aplikację.

+1

+1 izolowane przechowywanie w akcji ... rejestr może być również kolejnym kandydatem, ale wymaga więcej bezpieczeństwa niż pojedyncze miejsce. – Ian

0

@ Cour courtenay, @ James, Mam jedno głupie pytanie. Jak zatrzymać użytkownika przed tym plikiem? (Plik zawierający datę ważności). Jeśli użytkownik ma prawa do instalacji, to oczywiście użytkownik ma również dostęp do przeglądania plików. Zmiana rozszerzenia pliku nie pomoże. A więc, jak zachować ten plik w bezpiecznym miejscu i trzymać z dala od rąk użytkowników?

+0

Rozwiązania: szyfrowanie danych i/lub dodawanie skrótu do pliku. Jeśli plik jest uszkodzony, rozważ wersję próbną jako wygasłą. –

+0

Dzięki za odpowiedź Victor.Encrypting z pewnością sprawi, że plik stanie się nieczytelny. – Shekhar

+0

DPAPI może być przydatny? Zwłaszcza przy zastosowaniu unikalnej soli i ewentualnie użycia kontekstu maszyny zamiast kontekstu użytkownika (opakowania w C# w System.Security.Cryptography.DataProtection) –

0

Musisz zapisać pierwszy czas działania programu, aby to zrobić. Prawdopodobnie to zrobię, używając wbudowanych ustawień aplikacji w visual studio. Zrób program o nazwie InstallDate, który jest ustawieniem użytkownika, a domyślnie jest to DateTime.MinValue lub coś podobnego (np. 1/1/1900).

wtedy, gdy program jest uruchamiany czek jest prosta:

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.) 
    } 
} 

Ustawienia użytkownika przechowywane są w dość dziwnym miejscu (coś jak C: \ Documents and Settings \ nazwa_użytkownika \ Ustawienia lokalne \ Dane aplikacji) tak dla przeciętnego Joego to i tak będzie trudne. Jeśli chcesz być paranoikiem, po prostu zaszyfruj datę przed zapisaniem jej w ustawieniach.

EDYCJA: Westchnienie, błędne odczytanie pytania, nie tak złożone, jak myślałem>.>

13

DateTime.Now.Add (-30)

Daje datę 30 dni wstecz od teraz

+0

Świetny punkt! Cieszę się, że mogę to zobaczyć tutaj. –

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; 
     } 
    } 

Widziałem, że kod w jakiejś części jakiejś stronie. Wykonanie powyższego przykładu powoduje usterkę: Zmiana bieżącego czasu i daty na datę początkową wydłuży okres ważności aplikacji.

Rozwiązanie? Zobacz internetowy serwer czasu.

-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

Jeśli naprawdę uważasz, że Twój blok kodu dodaje coś znaczącego, czego jeszcze nie ma w innych 10 odpowiedziach, proszę podać wyjaśnienia. Niemniej wyjaśnienia zawsze powinny być zgodne z kodem tutaj w StackOverflow! – ZygD