CFDateFormatter オブジェクトの作成と使用
日付書式は、日付オブジェクトのテキスト表現を書式化し、日付と時刻のテキスト表現を日付オブジェクトに変換します。ロケール (通常はユーザーの現在のロケール) と時刻スタイルを指定して日付書式オブジェクトを作成し、カスタム書式文字列を指定することもできます。
日付書式の作成
CFDateFormatterCreate 関数を使用して日付書式を作成します。書式のロケールと書式の日付と時刻のスタイルを指定します。CFDateFormatterCreateStringWithDate を使用して日付をテキスト表現に変換します。
CFDateFormatter は、いくつかの日付と時刻の書式スタイル (short、medium、long、full) を定義します。また、コンポーネントの出力を抑止するために使用できる "none" スタイルも定義しています。スタイルの使用方法については、書式スタイルを使用してユーザーの設定で日付と時刻を表示 を参照してください。日付と時刻のスタイルは正確な形式を指定しません。これらのスタイルは、ロケール、ユーザー設定、およびオペレーティングシステムのバージョンによって異なります。正確な書式が必要な場合には、書式文字列を使用してカスタム書式を指定 に示すように、CFDateFormatterSetFormat 関数を使用して書式文字列を変更します。
書式スタイルを使用してユーザーの設定で日付と時刻を表示
以下のサンプルコードは、kCFDateFormatterLongStyle スタイルを使用して日付の完全な表現を提供する日付書式を作成します。
CFDateRef date = CFDateCreate(NULL, 123456); CFLocaleRef currentLocale = CFLocaleCopyCurrent(); CFDateFormatterRef dateFormatter = CFDateFormatterCreate (NULL, currentLocale, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle); CFStringRef formattedString = CFDateFormatterCreateStringWithDate (NULL, dateFormatter, date); CFShow(formattedString); // Memory management CFRelease(date); CFRelease(currentLocale); CFRelease(dateFormatter); CFRelease(formattedString); // Output (for en_US locale): January 2, 2001 2:17:36 AM PST
以下の例は、kCFDateFormatterNoStyle を使用して時間コンポーネントの出力を抑制する方法を示しています。
CFDateRef date = CFDateCreate(NULL, 123456); CFLocaleRef currentLocale = CFLocaleCopyCurrent(); CFDateFormatterRef dateFormatter = CFDateFormatterCreate (NULL, currentLocale, kCFDateFormatterShortStyle, kCFDateFormatterNoStyle); CFStringRef formattedString = CFDateFormatterCreateStringWithDate (NULL, dateFormatter, date); CFShow(formattedString); // Memory management CFRelease(date); CFRelease(currentLocale); CFRelease(dateFormatter); CFRelease(formattedString); // Output (for en_US locale): 1/2/01
リスト 1 に示すコード例は、異なるスタイルを使用して日付値の書式を比較します。説明の目的で、例は特定のロケールを指定しています。
リスト 1 : 日付書式のスタイルを比較
CFDateRef date = CFDateCreate(NULL, 123456); CFStringRef enUSLocaleIdentifier = CFSTR("en_US"); CFLocaleRef enUSLocale = CFLocaleCreate(NULL, enUSLocaleIdentifier); // Create different date formatters CFDateFormatterRef shortFormatter = CFDateFormatterCreate (NULL, enUSLocale, kCFDateFormatterShortStyle, kCFDateFormatterShortStyle); CFDateFormatterRef mediumFormatter = CFDateFormatterCreate (NULL, enUSLocale, kCFDateFormatterMediumStyle, kCFDateFormatterMediumStyle); CFDateFormatterRef longFormatter = CFDateFormatterCreate (NULL, enUSLocale, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle); CFDateFormatterRef fullFormatter = CFDateFormatterCreate (NULL, enUSLocale, kCFDateFormatterFullStyle, kCFDateFormatterFullStyle); // Create formatted strings CFStringRef shortString = CFDateFormatterCreateStringWithDate (NULL, shortFormatter, date); CFStringRef mediumString = CFDateFormatterCreateStringWithDate (NULL, mediumFormatter, date); CFStringRef longString = CFDateFormatterCreateStringWithDate (NULL, longFormatter, date); CFStringRef fullString = CFDateFormatterCreateStringWithDate (NULL, fullFormatter, date); fprintf(stdout, "Short formatted date = %s\n", CFStringGetCStringPtr(shortString, CFStringGetSystemEncoding())); fprintf(stdout, "Medium date = %s\n", CFStringGetCStringPtr(mediumString, CFStringGetSystemEncoding())); fprintf(stdout, "Long formatted date = %s\n", CFStringGetCStringPtr(longString, CFStringGetSystemEncoding())); fprintf(stdout, "Full formatted date = %s\n\n", CFStringGetCStringPtr(fullString, CFStringGetSystemEncoding())); // Memory management CFRelease(date); CFRelease(enUSLocale); CFRelease(shortFormatter); CFRelease(mediumFormatter); CFRelease(longFormatter); CFRelease(fullFormatter); CFRelease(shortString); CFRelease(mediumString); CFRelease(longString); CFRelease(fullString); // Output Short formatted date = 1/2/01 2:17 AM Medium date = Jan 2, 2001 2:17:36 AM Long formatted date = January 2, 2001 2:17:36 AM PST Full formatted date = Tuesday, January 2, 2001 2:17:36 AM PST
書式文字列を使用してカスタム書式を指定
通常、システムによってローカライズされた定義済みのスタイルを使用することをお勧めします。しかし、大きく言ってカスタム書式を使用する必要がある 2 つの状況があります。
- インターネットの日付のような固定形式の文字列の場合。
- 既存のスタイルと一致しないユーザーに見える要素
固定書式
日付書式用のカスタム固定書式を指定するには、setDateFormat: を使用して下さい。書式文字列は、Unicode 技術標準 #35 の書式パターンを使用します。標準のバージョンは、オペレーティングシステムのリリースによって異なります。
- OS X v10.9 と iOS 7では、バージョン tr35-31 を使用します。
- OS X v10.8 と iOS 6 では バージョン tr35-25 を使用します。
- iOS 5 は バージョン tr35-19 を使用します。
- OS X v10.7 と iOS 4.3 では バージョン tr35-17 を使用します。
- iOS 4.0、iOS 4.1、iOS 4.2 では、バージョン tr35-15 を使用します。
- iOS 3.2 では バージョン tr35-12 を使用します。
- OS X v10.6、iOS 3.0、iOS 3.1 では バージョン tr35-10 を使用します。
- OS X v10.5 では バージョン tr35-6 を使用します。
- OS X v10.4 では、バージョン tr35-4 を使用します。
以下の例は、カスタム書式文字列の使用方法を示しています。(yyyy を使用して年をフォーマットすることに注意してください。よくある間違いは、暦年ではなく、週の年を表す YYYY を使用することです)。
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); CFDateRef date = CFDateCreate(NULL, 123456); CFDateFormatterRef customDateFormatter = CFDateFormatterCreate (NULL, currentLocale, kCFDateFormatterNoStyle, kCFDateFormatterNoStyle); CFStringRef customDateFormat = CFSTR("yyyy-MM-dd*HH:mm"); CFDateFormatterSetFormat(customDateFormatter, customDateFormat); CFStringRef customFormattedDateString = CFDateFormatterCreateStringWithDate (NULL, customDateFormatter, date); CFShow(customFormattedDateString); // Memory management CFRelease(currentLocale); CFRelease(date); CFRelease(customDateFormatter); CFRelease(customFormattedDateString); // Output: 2001-01-02*02:17
ユーザーが閲覧可能な日付のカスタム書式
特定の要素セットを含む日付を表示するには、CFDateFormatterCreateDateFormatFromTemplate を使用して下さい。この関数は、使用したい日付コンポーネントを含む書式文字列を生成しますが、ユーザーに適した正しい句読点と順序 (つまり、ユーザーのロケールと環境設定に合わせてカスタマイズされた) を使用します。それから書式文字列を使用して書式 (formatter) を作成して下さい。
これの必要性を理解するには、曜日、日付、月を表示したい場所を考えます。書式スタイルを使用して日付のこの表現を作成することはできません (年を省略するスタイルはありません)。しかし、書式文字列を使って 簡単に一貫した 表現を正しく作成することもできません。一見すると、単純なように思えるかもしれませんが、厄介な問題があります。アメリカのユーザーは、通常、日付が "Mon Jan 3" の書式だと期待しますが、英国のユーザーは通常、日付は "Mon 31 Jan" の書式だと期待します。
以下の例は、この点を示しています。
CFStringRef dateComponents = CFSTR("yMMMMd"); CFLocaleRef usLocale = CFLocaleCreate(NULL, CFSTR("en_US")); CFStringRef usDateFormatString = CFDateFormatterCreateDateFormatFromTemplate(NULL, dateComponents, 0, usLocale); // Date format for English (United States): MMMM d, y CFLocaleRef gbLocale = CFLocaleCreate(NULL, CFSTR("en_GB")); CFStringRef gbDateFormatString = CFDateFormatterCreateDateFormatFromTemplate(NULL, dateComponents, 0, gbLocale); // Date format for English (United Kingdom): d MMMM y
前の章 次の章