简单设置软件有效期的方法

第一步  弄清Linuxgmtimelocaltime的区别

前段时间用到,写了段小测试代码,个人觉得足够清楚的表明了二者的区别了,还是不明白的话,就看看APUE里面的章节吧。

#include <time.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    time_t tmpcal_ptr = {0};
    struct tm *tmp_ptr = NULL;

    tmpcal_ptr = time(NULL);//获取系统时间,单位为秒
    printf("tmpcal_ptr=%d\n", tmpcal_ptr);   

    tmp_ptr = gmtime(&tmpcal_ptr);//转换成tm类型的结构体;
    printf("after gmtime, the time is:\n%d:%d:%d", tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec);

    tmp_ptr = localtime(&tmpcal_ptr); //转换成tm类型的结构体;
    printf("after localtime, the time is:\n%d:%d:%d", tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec);

return 0;
}

localtime是将时区考虑在内了,转出的当前时区的时间。但是注意,有些嵌入式设备上被裁减过的系统,时区没有被设置好,导致二者转出来的时间都是0时区的。

 

第二步 tm这个结构体的定义?

/*

 * Similar to the struct tm in userspace <time.h>, but it needs to be here so

 * that the kernel source is self contained.

 */

struct tm {

/*

 * the number of seconds after the minute, normally in the range

 * 0 to 59, but can be up to 60 to allow for leap seconds

 */

int tm_sec;

/* the number of minutes after the hour, in the range 0 to 59*/

int tm_min;

/* the number of hours past midnight, in the range 0 to 23 */

int tm_hour;

/* the day of the month, in the range 1 to 31 */

int tm_mday;

/* the number of months since January, in the range 0 to 11 */ //==>我们的月数需要加1

int tm_mon;

/* the number of years since 1900 *//我们的年数是从1900年开始计算的,因此,2017年的话,需要设置为tm_year + 117

long tm_year;

/* the number of days since Sunday, in the range 0 to 6 */

int tm_wday;

/* the number of days since January 1, in the range 0 to 365 */

int tm_yday;

};

从上面这些我们可以看出,年月日我们都可以获取到,这个相当给力,给我们后面判断时间带来了很大方便.

 

第三步 两个方案

方案一 如何控制软件的有效日期方案1

简单粗暴法,该方法直接在软件里写死到哪个日期后就不可用了,当然,如果你将日期强制改为这个日期之前,也是可以用的,不过软件发布后,用户不会将系统时间设置为过去的任何日子,因此,如果B2B的话可以这样做,因为下一步B2C的时候,C用的肯定是正确的系统时间(这里只考虑移动终端哈).欢迎各位大神前来拍砖讨论.

        time_t tmpcal_ptr = {0};

        struct tm *tmp_ptr = NULL;

        tmpcal_ptr = time(NULL);

        ALOGD("The time is %d", tmpcal_ptr);

        tmp_ptr = localtime(&tmpcal_ptr);

        ALOGD("after localtime, the time is:%d:%d:%d, %d:%d:%d", tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, tmp_ptr->tm_mday, tmp_ptr->tm_mon + 1, tmp_ptr->tm_year + 1900);

        int year_now = tmp_ptr->tm_year + 1900;

        int month_now = tmp_ptr->tm_mon + 1;

        int day_now = tmp_ptr->tm_mday;

        ALOGD("The time is %d - %d - %d", year_now, month_now, day_now);

        ALOGD("Checking license ......");

        if(year_now > 2017 || month_now >= 8 && day_now >= 26){

            ALOGE("The license EXPIRED ");

            return;//如果逾期,我们就不再进行初始化,这样功能就无法正常使用了.

        }

        ALOGD("The TS color enhance license's state is OK.");

方案二 如何控制软件的有效日期方案2

将第一次加载此功能的时间设置为初始时间,然后将该时间写入到/sdcard/Android/下面(希望有大神能指点将这个时间备份文件放在哪里更优雅的建议),这样就完成了初始时间的保存.

每次在打开软件前,均去/sdcard/Android下面检查时间文件是否存在:如果存在,则读取首次加载此功能的时间,否则将当前时间当做初次加载该功能的时间保存到/sdcard/Android.

然后就可以将本次开启该功能的时间减去之前记录的时间,即可判断该功能是否应该正常开启.

 

其它:如果计算函数耗时,我们倒是可以使用gettimeofday()函数,它能精确到微秒级.

 

References:

1.这个blog主要是讲述gmtimelocaltime的区别

http://www.linuxidc.com/Linux/2013-04/82670.htm

2.这个blog写的大而全,没重点

http://www.cnblogs.com/sun-frederick/p/4772535.html

3.这个blog主要讲了如何将1970年以来的秒数转换为年月日

我认为应尽量使用库函数来完成,这样能够减少不稳定性,不知道这样思考是否正确,欢迎大神拍砖

http://www.cnblogs.com/lebronjames/archive/2010/09/06/1819359.html

### 如何在 LabVIEW 中实现软件有效期限制 为了实现在 LabVIEW 中设置软件有效期,可以采用多种方法来确保应用程序仅能在特定的时间范围内运行。一种常见的方式是通过读取系统的当前日期并与预设的截止日期进行比较。如果当前日期超过了设定的截止日期,则阻止程序继续执行。 #### 方法一:使用 INI 文件存储到期日并验证 INI 文件是一种简单的配置文件格式,可用于保存应用程序的各种参数。对于有效期控制来说,在 INI 文件中定义一个表示许可证结束时间的关键字是一个不错的选择。 1. **创建 INI 文件** 创建一个新的文本文件作为 INI 配置文件,并向其中写入如下内容: ```ini [License] ExpiryDate=2024-12-31 ``` 2. **编写 VI 来加载和解析 INI 文件中的日期** 使用 `Read INI File` 函数节点从指定路径下的 INI 文件里获取 `ExpiryDate` 的值[^1]。 3. **转换字符串为日期对象** 将读取出的字符串形式的日期转化为 LabVIEW 可识别的标准日期类型以便后续处理。 4. **对比系统时间和许可期限** 获取计算机上的实时钟表信息,并将其同之前得到的截止日期做差分运算得出剩余天数。 5. **判断是否过期以及采取相应措施** 如果计算结果显示已超出允许使用的范围,则弹窗提示用户授权失效;反之则正常启动主界面。 ```vi // 假设已经完成上述步骤并将结果存放在变量 "daysLeft" if (daysLeft <= 0) { MessageBox("您的试用版本已过期,请联系供应商购买正式版!"); } else { // 继续执行其他功能... } ``` 这种方法简单易懂,易于维护更新,同时也便于开发者根据实际需求调整具体逻辑。 #### 方法二:嵌入加密算法生成唯一密钥 更高级一点的做法是在编译阶段利用某些哈希函数或对称/非对称加密技术生产唯一的激活码,该编码包含了关于产品序列号、安装ID 和有效时间段的信息。每次启动时重新校验此密钥的真实性及其所携带的时间戳字段,从而达到保护目的。 这种方式虽然增加了复杂度但也提供了更高的安全性保障,防止非法复制传播等问题的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值