非要写这个文章,原因是网上找了很久居然没有关于只传时分秒的方法!!!!!!!!!!!!
android上一个项目,在后台要做一个定时任务:在每天固定一个时间(如下午四点16:00:00)执行任务。
使用Timer做定时任务,调用scheduleAtFixedRate(new GetTimeTask(), Date() when, Constant.TWENTY_FOUR_HOURS)
中间变量是一个date类型,表示执行时间。
但发现new Date()时发现构造方法中没有设定时,分,秒的,而且都包含有年月日的信息。
解决方法:使用Timestamp
Timestamp time = new Timestamp(new Date().getTime());
time.setHours(hour);
time.setMinutes(mun);
time.setSeconds(sec);
设置的时分秒都是int型。就可以解决。
PS:中间做也有人让使用alarm进行定时任务,因为是一个android项目。但后来没采用他们的方法。
个人觉得:
1该定时任务是在后台可以运行,Timer有scheduleAtFixedRate(task, when, period)和scheduleAtFixedRate(task, delay, period)两类方法。而android是只有delay可以使用;
2 alarm是android封装好的闹钟定时,其内部实现估计也是一个Timer(因为没有深入研究);
3 执行定时任务时,alarm采用发广播机制,通知执行任务,会有毫秒级别延迟。
Undefined symbols for architecture i386: "_OBJC_CLASS_$_RiskViewController", referenced from: objc-class-ref in ZYBXStepsViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 解决办法 发现是真机引用的已删除的文件 _RiskViewController 所以有遇到同样的问题的童鞋 查找下你导入的类是否已经是删除的状态
1. tm结构体
struct tm {
int tm_sec; /* seconds after the minute [0-60] */int tm_min; /* minutes after the hour [0-59] */
int tm_hour; /* hours since midnight [0-23] */
int tm_mday; /* day of the month [1-31] */
int tm_mon; /* months since January [0-11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday [0-6] */
int tm_yday; /* days since January 1 [0-365] */
int tm_isdst; /* Daylight Savings Time flag */
long tm_gmtoff; /* offset from CUT in seconds */
char *tm_zone; /* timezone abbreviation */
};
2. 使用localtime获取本地时间,具体代码如下
//获取当前时间,采用C的库函数,返回值不需要外部释放,效率方面比使用OC的NSDate类高效3-4倍
- (struct tm*)getTime
{
//时间格式
struct timeval ticks;
gettimeofday(&ticks, nil);
time_t now;
struct tm* timeNow;
time(&now);
timeNow = localtime(&now);
timeNow->tm_gmtoff = ticks.tv_usec/1000; //毫秒
timeNow->tm_year += 1900; //tm中的tm_year是从1900至今数
timeNow->tm_mon += 1; //tm_mon范围是0-11
return timeNow;
}