今天做了一个关于关于本地推送的功能,调试很长时间,一开始是因为有一个NSDateFormatter 对象没有设置格式“YYYY-MM-dd”,后来发现,时分秒的给事是“HH:mm:ss”(ps:小时的双H要大些)
这些旁枝末节搞定之后,主要是因为NSDate的时差问题了。因为系统默认的NSDate的当前时间和我们实际上是有8个小时的时差的(这应该是因为我们中国和英国的本初子午线差8个时区),但这只是打印出来的显示效果上的差异(这是我后来发现的,不知道是不是正确,求证?)。也就是说,打印出来的默认时间会比我们现实中的时间慢8个小时,但实际上我们和英国佬是在同一个时间点上的,只是我们两个地方时钟显示的时间不一样罢了(不知道这么说,够不够清楚)。
那么现在问题就来了,我做本地推送功能的时候要给推送设置一个fireDate
UILocalNotification *notification = [[UILocalNotification alloc] init];
NSDate *date =[ [NSDate date] dateByAddingTimeInterval:10.0f]; //当前时间后的10秒钟,开始发送本地通知
notification.fireDate= date;
这就是设置什么时候发送通知。如果运行这几行代码的时间是 早上 12:00:00 ,那么date的打印出来的时间就是 4:00:10。
我做得时候就把这个date打印出来了,发现跟我预想的不太一样,这个4:00:10是不是意味着要等到手机的系统时间是4:00:10才会发送通知呢。于是 为了消除这个时差,我上网找到了消除时差的方法(请自行搜索)。消除了之后,我打印出来的date终于和我手机上的时间一样了,也就是说消除时差后,date打印出来的是 12:00:10。好了,现在我以为我能够放心的运行了。但是运行了之后,我一直等,一直等,都等不到本地通知的推送出现。我就奇怪了,代码明明是没有问题的,为什么会有不发送通知呢?
花了一段时间,我终于搞清楚了。解决的办法就是:删掉消除时差的代码,也就是date打印出来是 4:00:10时候的代码。
所以我觉得,虽然系统默认打印出来的当前时间[NSDate date]或许与我们的现实中的时间显示的时间不一样,但是对应的都是同一个时间点,而系统用的时自己的那一套时间,所以我们的12:00:00是系统的4:00:00,但是系统的12:00:00却是我们的20:00:00。
总结一下:在只为了显示时间数据的时候,我们可以利用消除时差后的date来作为显示。 而如果是为了利用某个时间点来实现某一功能的时候(比如上面所说,用时间来确定发送本地通知的时间),那么久使用系统自带的date就可以了,不必劳神我们消除时差。
网友评论