Ответ 1
string dateInString = "01.10.2009";
DateTime startDate = DateTime.Parse(dateInString);
DateTime expiryDate = startDate.AddDays(30);
if (DateTime.Now > expiryDate) {
//... trial expired
}
Мне нужно, чтобы мое приложение истекало через 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.AddDays
делает следующее:
DateTime expires = yourDate.AddDays(30);
Один я могу ответить уверенно!
DateTime expiryDate = DateTime.Now.AddDays(30);
Или, возможно, если вы просто хотите, чтобы дата не была привязана к времени, которая может быть более подходящей:
DateTime expiryDate = DateTime.Today.AddDays(30);
DateTime.Now.Add(-30)
Дает вам дату 30 дней назад
DateTime _expiryDate = DateTime.Now + TimeSpan.FromDays(30);
Возможное решение было бы в первом запуске, создать файл, содержащий текущую дату, и поместить его в IsolStorage. Для последующих прогонов проверьте содержимое файла и сравните его с текущей датой; если разница в дате превышает 30 дней, сообщите об этом пользователю и закройте приложение.
Лучшим решением может быть введение файла лицензии с помощью счетчика. Запишите в файл лицензии дату установки приложения (во время установки). Затем каждый раз, когда приложение запускается, вы можете редактировать файл лицензии и увеличивать счет на 1. Каждый раз, когда приложение запускается, вы просто выполняете быструю проверку, чтобы узнать, достигнуто ли 30 приложений приложения. I.e.
if (LicenseFile.Counter == 30)
// go into expired mode
Также это решит проблему, если пользователь вернет системные часы, так как вы можете сделать простую проверку, чтобы сказать
if (LicenseFile.InstallationDate < SystemDate)
// go into expired mode (as punishment for trying to trick the app!)
Проблема с вашей текущей настройкой заключается в том, что пользователю придется использовать приложение каждый день в течение 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;
}
}
Я видел этот код в некоторой части какого-то веб-сайта. Выполнение приведенного выше примера дает сбой: изменение текущего времени и даты на дату начала продлит срок действия приложения.
Решение? Обратитесь к серверу онлайн-времени.
@Ed courtenay, @James, У меня есть один глупый вопрос. Как уберечь пользователя от этого файла? (Файл с датой истечения срока действия). Если у пользователя есть права на установку, то, очевидно, у пользователя также есть доступ к файлам просмотра. Изменение расширения файла не поможет. Итак, как сохранить этот файл в безопасности и уйти от рук пользователей?
Для этого вам нужно сохранить первое время выполнения программы. Как бы я мог сделать это, используйте встроенные настройки приложения в visual studio. Сделайте один под названием InstallDate, который является пользовательской установкой, и по умолчанию используется DateTime.MinValue или что-то в этом роде (например, 1/1/1900).
Затем, когда программа запускается, проверка проста:
if (appmode == "trial")
{
// If the FirstRunDate is MinValue, it 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.)
}
}
Пользовательские настройки хранятся в довольно странном месте (что-то вроде C:\Documents and Settings\YourName\Local Settings\Application Data), поэтому среднему Джо будет сложно найти его в любом случае. Если вы хотите быть параноидальным, просто зашифруйте дату, прежде чем сохранять ее в настройках.
РЕДАКТИРОВАТЬ: Вздох, неправильно прочитайте вопрос, а не такой сложный, как я думал > . >
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;
}
}
}