iOS 时间戳在不同时区转换问题

iOS 时间戳在不同时区转换问题,第1张

一、给定一个10位时间戳,转成不同时区的日期

//给定一个时间戳

NSString test = @"1652861974”;

//转成北京时区下的日期

NSDateFormatter beijingFormatter = [[NSDateFormatter alloc] init];

[beijingFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSTimeZone beijingZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];

[beijingFormatter setTimeZone:beijingZone];

//转成手机系统设置的时区(纽约)下的日期

NSDateFormatter localFormatter = [[NSDateFormatter alloc] init];

[localFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSTimeZone localZone = [NSTimeZone systemTimeZone];//当前手机设置的是纽约时区

[localFormatter setTimeZone:localZone];

 NSDate testDate = [NSDate dateWithTimeIntervalSince1970:[test longLongValue]];

NSString beijingDateString = [beijingFormatter stringFromDate: testDate];//北京时区下的日期字符串 :“2022-05-18 16:19:34”

NSString localTimeString = [localFormatter stringFromDate: testDate];// 换成本地(纽约)时间:2022-05-18 04:19:34

NSLog(@"服务器返回北京时间:%@ 转换成本地时区时间:%@ ", beijingDateString, localTimeString);

结果打印: 服务器返回北京时间:2022-05-18 16:19:34 转换成本地时区时间:2022-05-18 04:19:34

二、反向验证同一时刻下世界在不同时区的日期返回的时间戳是相同的:

北京时区日期: 2022-05-18 16:19:34 ( 以上的beijingDateString对应的 )

纽约时区日期: 2022-05-18 04:19:34( 以上的localTimeString对应的 )

NSDate beiDate = [beijingFormatter dateFromString: beijingDateString];

NSTimeIntervalbeiInterval = [beiDate   timeIntervalSince1970];

NSDateLocDate = [localFormatter   dateFromString: localTimeString];

NSTimeIntervalLocInterval = [LocDate  timeIntervalSince1970];

NSLog(@"原始时间戳:%@ 北京时区生成时间戳:%f  本地时区生成时间戳:%f ",test,( double )beiInterval,( double ) LocInterval);

结果打印:  原始时间戳:1652861974  北京时区生成时间戳:1652861974000000   本地时区生成时间戳:1652861974000000 

验证了同一时刻虽然处于世界不同时区,但是拿到的时间戳是一样的,前提是转成对应时区下的日期即 NSDateFormatter要设置对应的时区。

Unix 时间戳是为了纪念 Unix 系统 1970 年生日,而将格林尼治时间 1970 年 1 月 1 日 0 点 0 分 0 秒 定义为整数 0,此后

每过一秒则该整数加 1,而 1970 年 1 月 1 日以前的时间则定义为负值。因此 Unix 时间与 Windows 时间换算的方法也很

简单,知道了 Unix 时间定义的 0 值到现在过了多少秒,再折算为分钟、小时、天、月、年,以 1970 年 1 月 1 日 00:00:00

为基准累加,就换算出了当前的 Windows 时间了。而 Windows 时间换算 Unix 时间则正好相反。

另外,b3log 中文章 url 所展示的 Unix 时间戳精确到毫秒,所以若想正确换算为 Windows 时间,需要去掉后三位才能正确

换算。如上图所示,>

//时间格式

NSDateFormatter formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"MMM dd,yyyy HH:mm tt"];

//时间字符串NSDate

NSDate date = [formatter dateFromString:string];

//NSDate转时间字符串

NSString dateString = [formatter stringFromDate:date];

//时间转时间戳

NSTimeInterval interval = [date timeIntervalSince1970];

//时间戳转时间

date = [NSDate dateWithTimeIntervalSince1970:interval];

一、NSTimer

1创建方法

TimerInterval : 执行之前等待的时间。比如设置成10,就代表1秒后执行方法

target : 需要执行方法的对象。

selector : 需要执行的方法

repeats : 是否需要循环

2释放方法

3特点

存在延迟:不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。

必须加入Runloop:使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入Runloop:

二、CADisplayLink

什么是CADisplayLink

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用。

一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。在添加进runloop的时候我们应该选用高一些的优先级,来保证动画的平滑。可以设想一下,我们在动画的过程中,runloop被添加进来了一个高优先级的任务,那么,下一次的调用就会被暂停转而先去执行高优先级的任务,然后在接着执行CADisplayLink的调用,从而造成动画过程的卡顿,使动画不流畅。

duration属性提供了每帧之间的时间,也就是屏幕每次刷新之间的的时间。我们可以使用这个时间来计算出下一帧要显示的UI的数值。但是 duration只是个大概的时间,如果CPU忙于其它计算,就没法保证以相同的频率执行屏幕的绘制 *** 作,这样会跳过几次调用回调方法的机会。frameInterval属性是可读可写的NSInteger型值,标识间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。如果每帧都调用一次的话,对于iOS设备来说那刷新频率就是60HZ也就是每秒60次,如果将 frameInterval 设为2 那么就会两帧调用一次,也就是变成了每秒刷新30次。我们通过pause属性开控制CADisplayLink的运行。当我们想结束一个CADisplayLink的时候,应该调用-(void)invalidate从runloop中删除并删除之前绑定的 targetselector

另外CADisplayLink 不能被继承。

1创建方法

2停止方法

当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate *** 作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。

3特点:

屏幕刷新时调用:CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒 延迟:iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。 如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。 使用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。4 重要属性 frameInterval NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。 duration readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。

三、GCD

1执行一次

swift版本:

DispatchSourceTimer

间隔定时器, 相当于repeats设置为true的Timer

初始化

设置timer参数

示例: 获取验证码60s倒计时

注意事项: 下面两种 *** 作会造成程序崩溃, 原因是: gcdTimer执行了suspend() *** 作后, 是不可以被直接释放的, 如果想关闭一个执行了suspend() *** 作的计时器, 需要先执行resume(), 再执行cancel(), 最后置nil

CADisplayLink 与 NSTimer 有什么不同

iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。

NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。并且 NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间的延迟范围。

CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。在UI相关的动画或者显示内容使用 CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。给非UI对象添加动画效果我们知道动画效果就是一个属性的线性变化,比如UIView 动画的 EasyInEasyOut 。通过数值按照不同速率的变化我们能生成更接近真实世界的动画效果。我们也可以利用这个特性来使一些其他属性按照我们期望的曲线变化。比如当播放视频时关掉视频的声音我可以通过CADisplayLink来实现一个 EasyOut的渐出效果:先快速的降低音量,在慢慢的渐变到静音。

注意

通常来讲:iOS设备的刷新频率事60HZ也就是每秒60次。那么每一次刷新的时间就是1/60秒 大概167毫秒。当我们的frameInterval值为1

的时候我们需要保证的是 CADisplayLink调用的 target 的函数计算时间不应该大于 167否则就会出现严重的丢帧现象。在mac应用中我们使用的不是CADisplayLink而是 CVDisplayLink它是基于C接口的用起来配置有些麻烦但是用起来还是很简单的。

手机拍照如何显示日期时间?导言1

如何设置手机拍照的日期和时间?首先打开相机,点击手机屏幕。其次,屏幕右上方有三个水平图标(标出)。会出现一个界面,然后点击“水印”。第三,会d出三个提示。这个需要打开网络和gps,点击同意和允许就可以了。这样照片的右下角就会显示当时的时间、地点和天气情况。或者,在打开的相机程序中,点击页面上的设置按钮三次,找到设置页面上的GPS标签选项,点击确定打开,完成设置。

手机拍照如何显示日期时间?导言2

第二种方法是在手机桌面中找到并打开手机的“图库”来设置拍照的日期和时间。其次,在手机图库中找到并打开一个相册,然后在相册中选择一张打开。第三,右上角有一个设置图标。单击打开设置,找到并打开最后一项“设置”。第四,在“设置”中找到“显示”一栏,打开默认关闭的“显示拍摄时间”和“显示拍摄地点”即可。或者手机QQ软件中的“动态”——“好友动态”,点击右上角的“加号”,选择“水印摄像头”选项。

手机拍照如何显示日期时间?导言三

苹果手机拍照没有日期显示。如果有,可以通过Camstamp插件实现,前提是手机已经成功越狱。Camstamp插件可以在Cydia搜索。在Camstamp的设置界面中,Enabled选项是设置是否打开Camstamp插件。当打开仅时间戳复制时,将产生照片的两份副本,并且第二张照片将添加拍照时间。时间戳颜色选项是时间字符的颜色显示,时间戳字体是设置时间字符的字体样式。还有,Camstamp插件目前只支持英文,时间格式要设置成24小时模式。当你在拍照界面时,你可以点击“选项”按钮。这里是快速“开/关”添加时间文本的功能。如果打开时间文本,拍照所需时间会略有增加。

以上就是关于iOS 时间戳在不同时区转换问题全部的内容,包括:iOS 时间戳在不同时区转换问题、iOS 时间戳问题、iOS字符串string时间和NSTimeInterval时间戳转换等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9760281.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存