在MacOSX中的時間操作

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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章