1、NSDate、NSDateFormatter獲取時間
獲取到毫秒時間戳
NSString* dateString;
NSDateFormatter * formatter = [[NSDateFormatter alloc ] init];
[formatter setDateFormat:@"yyyy/MM/dd HH:mm:ss.SSS"];
//年/月/日 時/分/秒.毫秒
dateString = [formatter stringFromDate:[NSDate date]];
2、NSDate、NSCalendar獲取時間
獲取到納秒時間戳
NSInteger era,year,month,day,hour,minute,second,nanosecond;
// 時區、年、月、日、時、分、秒、納秒
NSDate *date = [NSDate date];
NSCalendar *localCalendar = [NSCalendar currentCalendar];
[localCalendar getEra:&era year:&year month:&month day:&day fromDate:date];
[localCalendar getHour:&hour minute:&minute second:&second nanosecond:&nanosecond fromDate:date];
3、<sys/time.h>獲取時間
獲取到微秒時間
struct timeval tv;
struct timezone tz;
struct tm *p;
gettimeofday(&tv, &tz);
p = localtime(&tv.tv_sec);
//年 p->tm_year+1900
//月 p->tm_mon+1
//日 p->tm_mday
//時 p->tm_hour+1
//分 p->tm_min
//秒 p->tm_sec
//微秒 tv.tv_usec
//星期 p->wday+1
//年天 p->yday
數據結構的定義:
_STRUCT_TIMEVAL {
__darwin_time_t tv_sec; /* seconds */
__darwin_suseconds_t tv_usec; /* and microseconds */
};
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 UTC in seconds */
char *tm_zone; /* timezone abbreviation */
};
int gettimeofday(struct timeval * __restrict, void * __restrict);
struct tm *localtime(const time_t *);
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
};
4、<mach/mach_time.h>
計算一個代碼段運行耗時(納秒)
mach_timebase_info_data_t info;
if (mach_timebase_info(&info) != KERN_SUCCESS) return -1.0;
uint64_t start = mach_absolute_time ();
block ();
uint64_t end = mach_absolute_time ();
uint64_t elapsed = end - start;
uint64_t nanos = elapsed * info.numer / info.denom;
//納秒時間
5、NSDate獲取1970的時間
NSTimeInterval本身是個秒級別的double類型數值,小數點後面即毫秒數,*1000.0f即可得到毫秒級別的時間差
NSTimeInterval time = [[NSDate date] timeIntervalSince1970]
輸出結果示例:1584162491.226890,一定程度上來說小數點後的數據*1000之後,能夠獲取到us時間,不過精度沒有那麼高
6、NSProcessInfo
通過NSProcessInfo獲取到進程啓動的時間(807539.047739秒) 和 進程的其它相關信息
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
NSLog(@"environment:%@",processInfo.environment);
//進程運行環境,一個字典
NSLog(@"arguments:%@",processInfo.arguments);
//獲取進程開啓的時候,傳入的命令行參數信息,是一個參數數組
NSLog(@"hostName:%@",processInfo.hostName);
//主機名 Jerry.local
processInfo.processName = @"custom_process_name";
//設置進程名稱
NSLog(@"processName:%@",processInfo.processName);
//進程名稱 custom_process_name
NSLog(@"processIdentifier:%d",processInfo.processIdentifier);
//進程ID 51851
NSLog(@"globallyUniqueString:%@",processInfo.globallyUniqueString);
//全球唯一碼,進程每啓動一次,生成的globallyUniqueString都不一樣
//2B5608D4-EF1C-437B-ACE8-73BFA9E4E85F-51851-0002DE73D5D87B88
NSLog(@"operatingSystemVersionString:%@",processInfo.operatingSystemVersionString);
//獲取運行當前進程的設備的操作系統的版本號字符串,Version 10.14.5 (Build 18F203)
NSLog(@"operatingSystemVersion.majorVersion:%ld",processInfo.operatingSystemVersion.majorVersion);
//10
NSLog(@"operatingSystemVersion.minorVersion:%ld",processInfo.operatingSystemVersion.minorVersion);
//14
NSLog(@"operatingSystemVersion.patchVersion:%ld",processInfo.operatingSystemVersion.patchVersion);
//5
NSLog(@"systemUptime:%f",processInfo.systemUptime);
//獲取系統啓動的時間,單位是秒 807539.047739
NSLog(@"lowPowerModeEnabled:%d",processInfo.lowPowerModeEnabled);
//得到的是一個布爾值的結果:YES:開啓了低電量模式,NO:未開啓低電量模式,僅對iOS有用
environment和arguments詳細信息
environment:{
"Apple_PubSub_Socket_Render" = "/private/tmp/com.apple.launchd.axZ2IgB8PY/Render";
"CA_ASSERT_MAIN_THREAD_TRANSACTIONS" = 0;
"CA_DEBUG_TRANSACTIONS" = 0;
"DYLD_FRAMEWORK_PATH" = "/Users/jerry/XcodeProj/TestOC/build/Debug";
"DYLD_LIBRARY_PATH" = "/Users/jerry/XcodeProj/TestOC/build/Debug:/usr/lib/system/introspection";
GPUProfilerEnabled = YES;
HOME = "/Users/jerry";
LOGNAME = "jerry.yang";
"METAL_DEBUG_ERROR_MODE" = 0;
"METAL_DEVICE_WRAPPER_TYPE" = 1;
MallocNanoZone = 0;
NSUnbufferedIO = YES;
"OS_ACTIVITY_DT_MODE" = YES;
PATH = "/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin";
PWD = "/Users/jerry/XcodeProj/TestOC/build/Debug";
SHELL = "/bin/bash";
"SQLITE_ENABLE_THREAD_ASSERTIONS" = 1;
"SQLITE_EXEMPT_PATH_FROM_VNODE_GUARDS" = "/Users/jerry/Library/WebKit/Databases";
"SSH_AUTH_SOCK" = "/private/tmp/com.apple.launchd.f5BaoIbV3p/Listeners";
"SWIFTUI_VIEW_DEBUG" = 287;
TMPDIR = "/var/folders/mh/szrw8j2x4x9b73d8jmv1vb0m0000gn/T/";
USER = "jerry";
"XPC_FLAGS" = 0x0;
"XPC_SERVICE_NAME" = "com.apple.dt.Xcode.5808";
"__CF_USER_TEXT_ENCODING" = "0x1F5:0x0:0x0";
"__XCODE_BUILT_PRODUCTS_DIR_PATHS" = "/Users/jerry/XcodeProj/TestOC/build/Debug";
"__XPC_DYLD_FRAMEWORK_PATH" = "/Users/jerry/XcodeProj/TestOC/build/Debug";
"__XPC_DYLD_LIBRARY_PATH" = "/Users/jerry/XcodeProj/TestOC/build/Debug";
}arguments:(
"/Users/jerry/XcodeProj/TestOC/build/Debug/TestOC"
)
7、<sys/sysctl.h>
獲取系統啓動時間
kernel_task是個系統級的task,包括多線程調度管理、虛擬內存、系統IO、線程之間通信等等,所以系統已啓動,kernel_task就會跑起來,kernel_task運行的時間,就可以作爲啓動時間來使用。
sysctl函數用於獲取kernel_task的信息,函數返回值:成功:返回0; 失敗:返回-1
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
time_t now;
time_t uptime = -1;
(void)time(&now);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
{
uptime = now - boottime.tv_sec;
}
#include<sys/param.h>
#include<sys/sysctl.h>
int sysctl( int *name, u_int namelen, void *oldp, size_t *oldenp, void *newp, size_t newlen );
返回0:成功 -1:失敗
name參數是指定名字的一個整數數組,namelen參數指定了該數組中的元素數目。該數組
中的第一個元素指定本請求定向到內核的哪個子系統。第二個及其後元素依次細化指定該系
統的某個部分。爲了獲取某個值,oldp參數指向一個供內核存放該值的緩衝區。oldlenp則是一個值-結果參
數:函數被調用時,oldlenp指向的值指定該緩衝區的大小;函數返回時,該值給出內核存
放在該緩衝區中的數據量。如果這個緩衝不夠大,函數就返回ENOMEM錯誤。作爲特例,
Oldp可以是一個空指針,而oldlenp卻是一個非空指針,內核確定這樣的調用應該返回的數據量,並通過oldlenp返回這個大小。爲了設置某個新值,newp參數指向一個大小爲newlen參數值的緩衝區。如果不準備指定一
個新值,那麼newp應爲一個空指針,newlen因爲0.