計算2個日期間隔時間

計算2個日期間隔時間

計算2個時間的間隔多久不需要自行寫程式計算,只要使用 NSDateComponents 這個物件,再配合幾個物件:

  • NSCalendar
  • NSDateFormatter
  • NSDate

範例中是要計算從1979-12-03起至2013-03-29間隔時間共是多久,所以我們需要有2個時間點,開始的時間點使用NSDate並指定日期表示,再建立結束的時間點,有2個時間點之後,我們要使用NSCalendar設定為NSGregorianCalendar曆別。全部都準備到位之後,再由NSDateComponents計算2個時間的間隔: (閱讀全文…)

 字串轉成指定的日期格式

字串轉成指定的日期格式

正常情況我們利用NSDate取得日期的程式:

//-----------start-----------
    NSDate *date = [NSDate date];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"YYYY MMMM d EEEE"];
    NSString *dateString = [dateFormat stringFromDate:date];
    NSLog(@"%@",dateString);
//------------end------------

輸出的結果:

2013-03-29 10:30:41.328 testa1[45216:c07] 2013 March 29 Friday

(閱讀全文…)

 設定日期區域

設定日期區域

我們在設定日期格式未設定所在的區域時,日期的顯示就是以英語系為主,但如果您有設定區域,那顯示就會依照該區域的顯示方式,下面我們將顯示設定成台灣:

//-----------start-----------
    [dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_TW"]];
    [dateFormat setDateFormat:@"MM/dd/yyyy hh:mm a"];
    NSLog(@"date: %@", [dateFormat stringFromDate:today]);
//------------end------------

輸出結果:

2013-03-28 22:27:04.328 testa1[33029:c07] date: 03/28/2013 10:27 下午

(閱讀全文…)

 設定日期輸出格式

設定日期輸出格式

想要改變日期輸出的格式可以使用NSDateFormattersetDateFormat,根據Date Formatters網頁提供的輸入的規格與在iOS上比對之後,大略上與網頁的差不多。

年:yyyy 月:MM 日:dd 時:hh(12小時制),HH(24小時制) 分:mm 時制:a (AM/PM)

例1:

預計的日期輸出格式為:年/月/日 時(24小時制):分,所以要輸入:yyyy/MM/dd HH:mm

//-----------start-----------
    NSDate *today = [NSDate dateWithTimeIntervalSinceNow:0];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy/MM/dd HH:mm"];
    NSLog(@"date: %@", [dateFormat stringFromDate:today]);
//------------end------------

輸出結果: (閱讀全文…)

 Objective-C 快速參考

Objective-C 快速參考

Objective-C是利用幾個重要的觀念和C一些語法構成,然後再配合Foundation Framework完成最基本的Objective-C的環境在iOS或OSX上執行的APP,所以在文中只針對Objective-C提供的特性去做說明,Foundation Framework就歸類於Framework再做介紹。

呼叫方法 (Calling Methods)

基本方法

Objective-C在呼叫方法時是以訊息的方式傳遞,而方法如果有參數時就必需要以:冒號隔開。

//-----------start-----------
[object method];
[object methodWithParameter:parameter];
//------------end------------

(閱讀全文…)

 NSData轉Byte、Byte轉NSData

NSData轉Byte、Byte轉NSData

NSData提供可以儲存任意字元資料的物件,它提供了介面來使用儲存的資料,所以程式在物件的環境中會更方便,記憶體管理也更容易,不過有時候與C程式要互通時,還是必需要轉成Byte方式給C程式使用,所以下面將針對這兩種型別轉換做介紹。

NSData 轉 Byte

這裡假設有個檔案為danny.bin,我們利用NSData將檔案讀入並且轉成Byte陣列,這裡要注意的是,在C裡面並沒有Byte的類型,而是用unsigned char的方式。

//-----------start-----------
    unsigned char *cData;
    NSData* nsData=[NSData dataWithContentsOfFile:@"danny.bin"];
    cData = malloc([nsData length]);
    [nsData getBytes:cData];
//------------end------------

(閱讀全文…)

 C 字串與 NSString 互轉

C 字串與 NSString 互轉

C 字串(String)使用的是 char 類型,將每個char串連起來利用指標型式成為字串,Objective-C使用的是NSString,它是利用物件的方式存放整個字串,預設是使用Unicode 16bit存放,通常叫他 unichar ,所以在C String與NSString中間需要轉換,下面範例會介紹兩種互轉的方式。

  • NSString to C String (NSString to String)

Apple官方NSString Class文件中有提到UTF8String的NSString method,轉換完成後會在最後加個NULL當做字串的結尾,也符合C字串陣例的存放原則。

UTF8String
Returns a null-terminated UTF8 representation of the receiver.

所以:

//-----------start-----------
NSString nstr=@"Danny123";
const char *str=[nsstr UTF8String];
//------------end------------

  • C String to NSString (String to NSString)

方法1:

Apple官方NSString Class文件中有提到stringWithUTF8String,轉換後會返回使用UTF8編碼的C陣列。

stringWithUTF8String:
Returns a string created by copying the data from a given C array of UTF8-encoded bytes.

程式:

//-----------start-----------
NSString *new_nstr=[NSString stringWithUTF8String:databaseName];
//------------end------------

方法2:

Apple官方NSString Class文件中有提到stringWithCString:encoding,轉換後會返回使用指定編碼的C陣列。

stringWithCString:encoding:
Returns a string containing the bytes in a given C array, interpreted according to a given encoding.

程式:

//-----------start-----------
   NSString *new_nstr=[NSString stringWithCString:databaseName encoding:NSUTF8StringEncoding];
//------------end------------

在Objective-C中的C String存放都是以UTF-8編碼,所以整個轉換過程必需要以UTF-8為主。

 檢查檔案是否存在

檢查檔案是否存在

檢查檔案是否存在則是使用NSFileManager的fileExistsAtPath並將要檢查的檔案完整路徑傳入來驗證檔案存在性與否。 例如:有個存於Documents目錄並叫1.txt的檔案,要檢查它是否存在時就必需先知道它的完整路徑:

//-----------start-----------
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filepath=[documentsDirectory stringByAppendingPathComponent:@"1.txt"];
//------------end------------

所以整個路徑就是:

/Users/danny/Library/Application Support/iPhone Simulator/6.0/Applications/BC7239AA-D727-4D8C-B986-B5A55F8C781D/Documents/1.txt

之後再將存有完整路徑的filepath傳至fileExistsAtPath讓它檢查檔案是否存在。

//-----------start-----------
   if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]){
        //這裡放置如果檔案存在時的程式
    }else{
        NSLog(@"檔案不存在!");
    }
//------------end------------

 取得Temp完整路徑

取得Temp完整路徑

有時需要建立暫存檔時,就可以使用iOS為每個APP提供的temp目錄,要得知完整路徑其實很簡單,Framework中提供NSTemporaryDirectory()來得知暫存檔的完整路徑,並輸出NSString的格式內容。

//-----------start-----------
NSLog(@"%@\n",NSTemporaryDirectory());
//------------end------------

輸出結果:

/Users/danny/Library/Application Support/iPhone Simulator/6.0/Applications/BC7239AA-D727-4D8C-B986-B5A55F8C781D/tmp/