2009-11-03 4 views
20

내 응용 프로그램이 오늘부터 30 일 후에 만료되어야합니다. 응용 프로그램 config에 현재 날짜를 저장합니다. 응용 프로그램이 만료되었는지 어떻게 확인합니까? 사용자가 시계를 다시 변경하고 앱이 작동하면 걱정하지 않아도됩니다 (너무 바보스러운 사용자).C# 30 오늘부터 오늘 날짜

if (appmode == "Trial") {    

      ???? 

      } 

답변

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);'필요 없음 – Scoregraphic

+5

'DateTime expiryDate = startDate.AddDays (30);'올바른 것이므로'expiryDate.AddDays (30)'가 결과를 너바나에 씁니다. – Oliver

+0

Oliver, 패치 주셔서 감사합니다. –

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

한 나는 자신있게 대답 할 수!

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

또는 아마도 - 그냥 더 적합 할 수도 부착 한 번하지 않고 날짜를 원하는 경우 :

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

DateTime.AddDays가 수행합니다

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

결과를 지정하려면 기억하십시오. 나는 항상 yourdate를하고 있습니다 .AddDays (30) 그리고 왜 yourDate가 변경되지 않았는지 궁금합니다. –

+1

yourDate는 변경되지 않지만 만료 날짜는이 인스턴스의 ok입니다. – James

+0

@Cameron : 'DateTime expires'부분이 사진에 포함됩니다. –

1

더 나은 솔루션 카운터가있는 라이센스 파일을 소개하는 것일 수 있습니다. 라이센스 파일에 응용 프로그램 설치 날짜 (설치 중)를 작성하십시오. 그리고 매번 응용 프로그램이 라이센스 파일을 편집하고 응용 프로그램이 그냥 응용 프로그램의 30가 사용하는

if (LicenseFile.Counter == 30) 
    // go into expired mode 
, 즉 도달 있는지 확인하기 위해 빠른 검사를 할 시작 1 씩마다 카운트를 증가 할 수 있습니다 실행 사용자가 당신이

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

현재 설정의 문제라고하는 간단한 검사를 할 수있는 다시 시스템 시계를 넣어 경우

또한이 사용자가 응용 프로그램마다 하루를 사용해야합니다 문제입니다 해결됩니다 전체 30 일 평가판을 받으려면 30 일.

+0

설치 일로부터 30 일 또는 처음 사용 일로부터 전혀 희귀하지 않거나 불합리합니다. – Murph

+1

네, 말씀 드렸듯이 30 일간의 평가판을 사용하려면 30 일 동안 매일 트로트에서 애플리케이션을 사용해야합니다. 대부분의 응용 프로그램은 요즘 응용 프로그램을 처음 사용했거나 설치 한 시점과 관계없이 30 일간 전체적으로 사용할 수 있습니다. – James

2

가능한 해결책은 처음 실행될 때 현재 날짜를 포함하는 파일을 작성하고 IsolatedStorage에 저장하십시오. 후속 실행의 경우 파일의 내용을 확인하고 현재 날짜와 비교하십시오. 날짜 차이가 30 일보다 큰 경우 사용자에게 알리고 신청서를 닫으십시오.

+1

+1 격리 된 저장소가 작동 중입니다 ... 격리 된 저장소보다 더 많은 보안이 필요하지만 레지스트리도 다른 후보가 될 수 있습니다. – Ian

0

@Ed courtenay, @James, 나는 바보 같은 질문이 있습니다. 이 파일에서 사용자를 멀리하는 방법 (만료일이 포함 된 파일). 사용자에게 설치 권한이있는 경우 분명히 사용자가 파일을 볼 수 있습니다. 파일 확장자를 변경하면 도움이되지 않습니다. 그렇다면이 파일을 안전하게 보관하고 사용자의 손이 닿지 않도록하는 방법은 무엇입니까?

+0

솔루션 : 데이터 암호화 및/또는 파일 해시 추가. 파일이 손상된 경우 평가판이 만료 된 것으로 간주하십시오. –

+0

Victor에 대답 해 주셔서 감사합니다 .Encrypting은 파일을 읽을 수 없게 만듭니다. – Shekhar

+0

DPAPI가 유용 할 수 있습니까? 특히 응용 프로그램의 고유 한 소금 및 아마도 사용자 컨텍스트 (System.Security.Cryptography.DataProtection의 C#에있는 래퍼) 대신 컴퓨터 컨텍스트를 사용하는 경우 –

0

이 작업을 수행하려면 프로그램의 첫 번째 실행 시간을 저장해야합니다. 아마 내가 Visual Studio에서 응용 프로그램 설정에 내장 된 것을 사용하고 있습니다. InstallDate를 User Setting이라고하고 기본값은 DateTime.MinValue 또는 이와 비슷한 것 (예 : 1/1/1900)을 만듭니다. 프로그램이 검사를 실행되어 다음

은 간단하다 : 너무 :

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

사용자 설정은 꽤 이상한 위치에 (\ 문서 및 설정 \ Yourname 활용할 \ 로컬 설정 \ 응용 프로그램 데이터 C 같은)에 저장된다 그것은 평균 조가 어쨌든 그것을 찾는 것은 꽤 어려울 것입니다. 편집증에 걸리고 싶다면 설정을 저장하기 전에 날짜를 암호화하십시오.

EDIT : 내가 생각했던 것보다 한숨 쉬우면서 질문을 잘못 읽었습니다.>

13

DateTime.Now.Add는 (-30)

30 일 다시 지금

+0

훌륭한 포인트! 이것을 여기에서 보아서 기쁘다. –

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

에서 당신에게 날짜를 제공 좀 웹 사이트의 일부에 해당 코드를 보았다. 위의 예제를 수행하면 결함이 드러납니다. 현재 시간 및 날짜를 ​​시작 날짜로 변경하면 응용 프로그램 만료 시간이 길어집니다.

해결책? 온라인 시간 서버를 참조하십시오.

-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

코드 블록이 다른 10 개의 대답에 아직 언급되지 않은 의미있는 내용을 추가한다고 생각한다면 설명을하십시오. 그럼에도 불구하고 설명은 항상 여기 StackOverflow의 코드를 따라야합니다! – ZygD

관련 문제