내 응용 프로그램이 오늘부터 30 일 후에 만료되어야합니다. 응용 프로그램 config에 현재 날짜를 저장합니다. 응용 프로그램이 만료되었는지 어떻게 확인합니까? 사용자가 시계를 다시 변경하고 앱이 작동하면 걱정하지 않아도됩니다 (너무 바보스러운 사용자).C# 30 오늘부터 오늘 날짜
if (appmode == "Trial") {
????
}
내 응용 프로그램이 오늘부터 30 일 후에 만료되어야합니다. 응용 프로그램 config에 현재 날짜를 저장합니다. 응용 프로그램이 만료되었는지 어떻게 확인합니까? 사용자가 시계를 다시 변경하고 앱이 작동하면 걱정하지 않아도됩니다 (너무 바보스러운 사용자).C# 30 오늘부터 오늘 날짜
if (appmode == "Trial") {
????
}
string dateInString = "01.10.2009";
DateTime startDate = DateTime.Parse(dateInString);
DateTime expiryDate = startDate.AddDays(30);
if (DateTime.Now > expiryDate) {
//... trial expired
}
DateTime _expiryDate = DateTime.Now + TimeSpan.FromDays(30);
한 나는 자신있게 대답 할 수!
DateTime expiryDate = DateTime.Now.AddDays(30);
또는 아마도 - 그냥 더 적합 할 수도 부착 한 번하지 않고 날짜를 원하는 경우 :
DateTime expiryDate = DateTime.Today.AddDays(30);
DateTime.AddDays
가 수행합니다
DateTime expires = yourDate.AddDays(30);
결과를 지정하려면 기억하십시오. 나는 항상 yourdate를하고 있습니다 .AddDays (30) 그리고 왜 yourDate가 변경되지 않았는지 궁금합니다. –
yourDate는 변경되지 않지만 만료 날짜는이 인스턴스의 ok입니다. – James
@Cameron : 'DateTime expires'부분이 사진에 포함됩니다. –
더 나은 솔루션 카운터가있는 라이센스 파일을 소개하는 것일 수 있습니다. 라이센스 파일에 응용 프로그램 설치 날짜 (설치 중)를 작성하십시오. 그리고 매번 응용 프로그램이 라이센스 파일을 편집하고 응용 프로그램이 그냥 응용 프로그램의 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 일.
가능한 해결책은 처음 실행될 때 현재 날짜를 포함하는 파일을 작성하고 IsolatedStorage에 저장하십시오. 후속 실행의 경우 파일의 내용을 확인하고 현재 날짜와 비교하십시오. 날짜 차이가 30 일보다 큰 경우 사용자에게 알리고 신청서를 닫으십시오.
+1 격리 된 저장소가 작동 중입니다 ... 격리 된 저장소보다 더 많은 보안이 필요하지만 레지스트리도 다른 후보가 될 수 있습니다. – Ian
@Ed courtenay, @James, 나는 바보 같은 질문이 있습니다. 이 파일에서 사용자를 멀리하는 방법 (만료일이 포함 된 파일). 사용자에게 설치 권한이있는 경우 분명히 사용자가 파일을 볼 수 있습니다. 파일 확장자를 변경하면 도움이되지 않습니다. 그렇다면이 파일을 안전하게 보관하고 사용자의 손이 닿지 않도록하는 방법은 무엇입니까?
솔루션 : 데이터 암호화 및/또는 파일 해시 추가. 파일이 손상된 경우 평가판이 만료 된 것으로 간주하십시오. –
Victor에 대답 해 주셔서 감사합니다 .Encrypting은 파일을 읽을 수 없게 만듭니다. – Shekhar
DPAPI가 유용 할 수 있습니까? 특히 응용 프로그램의 고유 한 소금 및 아마도 사용자 컨텍스트 (System.Security.Cryptography.DataProtection의 C#에있는 래퍼) 대신 컴퓨터 컨텍스트를 사용하는 경우 –
이 작업을 수행하려면 프로그램의 첫 번째 실행 시간을 저장해야합니다. 아마 내가 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 : 내가 생각했던 것보다 한숨 쉬우면서 질문을 잘못 읽었습니다.>
DateTime.Now.Add는 (-30)
30 일 다시 지금
훌륭한 포인트! 이것을 여기에서 보아서 기쁘다. –
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;
}
}
에서 당신에게 날짜를 제공 좀 웹 사이트의 일부에 해당 코드를 보았다. 위의 예제를 수행하면 결함이 드러납니다. 현재 시간 및 날짜를 시작 날짜로 변경하면 응용 프로그램 만료 시간이 길어집니다.
해결책? 온라인 시간 서버를 참조하십시오.
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;
}
}
}
코드 블록이 다른 10 개의 대답에 아직 언급되지 않은 의미있는 내용을 추가한다고 생각한다면 설명을하십시오. 그럼에도 불구하고 설명은 항상 여기 StackOverflow의 코드를 따라야합니다! – ZygD
'DateTime expiryDate = new DateTime (startDate);'필요 없음 – Scoregraphic
'DateTime expiryDate = startDate.AddDays (30);'올바른 것이므로'expiryDate.AddDays (30)'가 결과를 너바나에 씁니다. – Oliver
Oliver, 패치 주셔서 감사합니다. –