一、給定一個(gè)10位時(shí)間戳,轉(zhuǎn)成不同時(shí)區(qū)的日期

成都創(chuàng)新互聯(lián)公司10多年企業(yè)網(wǎng)站建設(shè)服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站建設(shè)及推廣,對成都砂巖浮雕等多個(gè)行業(yè)擁有多年的網(wǎng)站營銷經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。
//給定一個(gè)時(shí)間戳
NSString?*test =?@"1652861974”;
//轉(zhuǎn)成北京時(shí)區(qū)下的日期
NSDateFormatter?*beijingFormatter = [[NSDateFormatter?alloc]?init];
[beijingFormatter?setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSTimeZone?*beijingZone = [NSTimeZone?timeZoneWithAbbreviation:@"GMT+0800"];
[beijingFormatter?setTimeZone:beijingZone];
//轉(zhuǎn)成手機(jī)系統(tǒng)設(shè)置的時(shí)區(qū)(紐約)下的日期
NSDateFormatter?*localFormatter = [[NSDateFormatter?alloc]?init];
[localFormatter?setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSTimeZone?*localZone = [NSTimeZone?systemTimeZone];//當(dāng)前手機(jī)設(shè)置的是紐約時(shí)區(qū)
[localFormatter?setTimeZone:localZone];
NSDate* testDate = [NSDate?dateWithTimeIntervalSince1970:[test?longLongValue]];
NSString* beijingDateString = [beijingFormatter stringFromDate:?testDate];//北京時(shí)區(qū)下的日期字符串 :“2022-05-18 16:19:34”
NSString* localTimeString = [localFormatter stringFromDate:?testDate];// 換成本地(紐約)時(shí)間:2022-05-18 04:19:34
NSLog(@"服務(wù)器返回北京時(shí)間:%@ 轉(zhuǎn)換成本地時(shí)區(qū)時(shí)間:%@ ",?beijingDateString,?localTimeString);
結(jié)果打印: 服務(wù)器返回北京時(shí)間:2022-05-18 16:19:34 轉(zhuǎn)換成本地時(shí)區(qū)時(shí)間:2022-05-18 04:19:34
二、反向驗(yàn)證同一時(shí)刻下世界在不同時(shí)區(qū)的日期返回的時(shí)間戳是相同的:
北京時(shí)區(qū)日期: 2022-05-18 16:19:34 ( 以上的beijingDateString對應(yīng)的 )
紐約時(shí)區(qū)日期: 2022-05-18 04:19:34( 以上的localTimeString對應(yīng)的 )
NSDate?*beiDate = [beijingFormatter?dateFromString:?beijingDateString];
NSTimeIntervalbeiInterval = [beiDate?? timeIntervalSince1970];
NSDate*LocDate = [localFormatter?? dateFromString:?localTimeString];
NSTimeIntervalLocInterval = [LocDate? timeIntervalSince1970];
NSLog(@"原始時(shí)間戳:%@?北京時(shí)區(qū)生成時(shí)間戳:%f??本地時(shí)區(qū)生成時(shí)間戳:%f ",test,( double )beiInterval,( double )?LocInterval);
結(jié)果打印: ?原始時(shí)間戳:1652861974? 北京時(shí)區(qū)生成時(shí)間戳:1652861974.000000 ? 本地時(shí)區(qū)生成時(shí)間戳:1652861974.000000?
驗(yàn)證了同一時(shí)刻雖然處于世界不同時(shí)區(qū),但是拿到的時(shí)間戳是一樣的,前提是轉(zhuǎn)成對應(yīng)時(shí)區(qū)下的日期即 NSDateFormatter要設(shè)置對應(yīng)的時(shí)區(qū)。
///獲取UTC時(shí)間戳
+(NSString *)getNowUTCTimeTimestamp{
NSDate *datenow = [NSDate date];
NSTimeZone *zone = [NSTimeZone localTimeZone];
// 獲取指定時(shí)間所在時(shí)區(qū)與UTC時(shí)區(qū)的間隔秒數(shù)
NSInteger seconds = [zone secondsFromGMTForDate:[NSDate date]];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970] - seconds];
return timeSp;
}
在iOS中我們經(jīng)常需要使用到時(shí)間戳,但在iOS下獲取“時(shí)間”的方法有很多。不過總的來說,我們可以在iOS中獲取的時(shí)間戳主要有兩類----絕對時(shí)間與相對時(shí)間。下面將總結(jié)一下這些方法之間的關(guān)系。
絕對時(shí)間是指那些以固定時(shí)間為參考系的時(shí)間戳。
常用的有Foundation框架中的
[[NSDate date] timeIntervalSinceReferenceDate];
以及CoreFoundation框架中的
CFAbsoluteTimeGetCurrent();
上述兩種方法是等價(jià)的,所參考的起始時(shí)間都是世界時(shí)間(UTC)2001年1月1日凌晨,所返回的double類型的結(jié)果都是從參考時(shí)間至今經(jīng)過的秒數(shù)。
除了剛才提到的參考時(shí)間,還有以世界時(shí)間(UTC)1970年1月1日凌晨為參考系的
[[NSDate date] timeIntervalSince1970];
由于參考系是固定的,顯然每次通過這些方法獲取的時(shí)間戳都將是不同的。但絕對不變的參考系并不意味著絕對可靠的結(jié)果,實(shí)際上當(dāng)用戶手動(dòng)改變了設(shè)備上的系統(tǒng)時(shí)間后,基于系統(tǒng)時(shí)鐘的上述方法返回的結(jié)果也會(huì)一同改變。
假如我們想獲取一種不會(huì)被用戶手動(dòng)修改而影響的時(shí)間戳,該怎么辦?答案是相對時(shí)間。
相對時(shí)間是指以非固定時(shí)間為參考系返回的時(shí)間戳
常用的有Foundation框架中的
[[NSProcessInfo processInfo] systemUptime];
和QuartzCore框架中的
CACurrentMediaTime();
上面兩種方法獲取到的都是設(shè)備自最近一次啟動(dòng)至今經(jīng)過的時(shí)間戳。 CFAbsoluteTimeGetCurrent() 方法調(diào)用底層的 mach_absolute_time() 方法后將結(jié)果轉(zhuǎn)換成秒返回。該結(jié)果是設(shè)備自最近一次啟動(dòng)至今經(jīng)過的時(shí)間,不隨系統(tǒng)時(shí)間改變而改變,但當(dāng)設(shè)備重啟后,該方法返回的結(jié)果也會(huì)重置。
兩類時(shí)間戳都有各自的特點(diǎn):
絕對時(shí)間參考固定的時(shí)間點(diǎn)返回時(shí)間戳但結(jié)果會(huì)受系統(tǒng)時(shí)鐘的影響;
相對時(shí)間在設(shè)備不重啟的情況下總能正確返回某一時(shí)間段內(nèi)流逝的時(shí)間;
所以具體要使用哪種方法獲取時(shí)間戳需要結(jié)合不同的需求場景去選擇。
獲取到了時(shí)間戳,也許我們需要利用它來轉(zhuǎn)換為時(shí)間并以一定的格式去展示,NSDate轉(zhuǎn)NSString的方法網(wǎng)上有很多,在這里就不再敘述。需要注意的一點(diǎn)是,獲取到絕對時(shí)間戳是以世界時(shí)間(UTC)為準(zhǔn)的,NSDate中保存的日期也是以世界時(shí)間(UTC)為準(zhǔn)的,所以在通過NSDateFormatter轉(zhuǎn)換為NSString的時(shí)候一定要注意當(dāng)前的時(shí)區(qū)。
如果App本身對獲取的時(shí)間精度要求很高,還是直接通過網(wǎng)絡(luò)從服務(wù)器獲取時(shí)間戳?xí)容^保險(xiǎn)。當(dāng)網(wǎng)絡(luò)可用時(shí),直接從服務(wù)器獲取;網(wǎng)絡(luò)不可用時(shí),且設(shè)備沒有被重啟過,可以根據(jù)上一次獲取服務(wù)器時(shí)間戳的時(shí)刻到此時(shí)的時(shí)間差來推算出正確的時(shí)間。
all-in-the-timing-keeping-track-of-time-passed-on-ios
1. 將時(shí)間戳轉(zhuǎn)換成日期格式:
function timestampToTime(timestamp) {
? ? var date = new Date(timestamp * 1000);//時(shí)間戳為10位需*1000,時(shí)間戳為13位的話不需乘1000
? ? Y = date.getFullYear() + '-';
? ? M = (date.getMonth()+1 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
? ? D = date.getDate() + ' ';
? ? h = date.getHours() + ':';
? ? m = date.getMinutes() + ':';
? ? s = date.getSeconds();
? ? return Y+M+D+h+m+s;
}
timestampToTime(1403058804);
console.log(timestampToTime(1403058804));//2014-06-18 10:33:24
注意:如果是Unix時(shí)間戳記得乘以1000。比如:
2. 將日期格式轉(zhuǎn)換成時(shí)間戳:
var date = new Date('2014-04-23 18:55:49:123');
// 有三種方式獲取
var time1 = date.getTime();
var time2 = date.valueOf();
var time3 = Date.parse(date);
console.log(time1);//1398250549123
console.log(time2);//1398250549123
console.log(time3);//1398250549000
標(biāo)題名稱:ios開發(fā)時(shí)間戳轉(zhuǎn)換,iPhone 時(shí)間戳
網(wǎng)址分享:http://chinadenli.net/article3/dsshcos.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站導(dǎo)航、軟件開發(fā)、服務(wù)器托管、網(wǎng)站維護(hù)、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)