【Android】日付・時間のフォーマット調査【iOS】

仕事でお知らせ配信の一覧表示時に送信日時を表示したいというお話

サーバーから受け取る日時データはLong型のミリ秒
これをAndroidではDateUtilsを
iOSではNSDataFormatterを使ってフォーマットします

■Android

long time = XXXXX; // 送信日時ミリ秒
String timeStr = DateUtils.formatDateTime(context, time, DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME);
textView.setText(timeStr);

上記結果では
日本:2019年2月28日 16:00
英語:February 28, 2019, 4:00 PM

DateUtils.formatDateTime(context, time, DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR);

FORMAT_24HOURを追加すると
日本:2019年2月28日 16:00
英語:February 28, 2019, 16:00

→英語でAMPM表示が24時表示になった

(DateUtils.formatDateTime(context, time, DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR));

FORMAT_NUMERIC_DATEを追加すると
日本:2019/2/28 16:00
英語:2/28/2019, 16:00

→日本語英語ともに年月日の表示が"/"区切りになり、英語の月表示が数字になった


■iOS

NSDateFormatter formatter = [[NSDateFormatter alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
[formatter setCalendar:calendar];
[formatter setLocale:[NSLocale currentLocale]]; // システム設定の言語を設定する
[formatter setTimeZone:[NSTimeZone systemTimeZone]];

[formatter setDateStyle: NSDateFormatterShortStyle]; // 日付のスタイル設定
[formatter setTimeStyle: NSDateFormatterShortStyle]; // 時間のスタイル設定

NSDate* time = XXXX; // 送信日時
NSString* timeStr = [formatter stringFromDate: time]];

[textView setText: timeStr];

各スタイルがNSDateFormatterShortStyleの場合
日本(言語:日本 地域:日本):2019/02/28 16:00
英語(言語:English 地域:日本):2019/02/28 16:00
英語(言語:English 地域:United States):2/28/19, 4:00 PM

→日本は日付は"/"区切り、24時表示
 言語をアメリカ、地域は日本の場合も同じ
 言語、地域をアメリカにすると時間がAMPM表示に変化

[formatter setDateStyle: NSDateFormatterMediumStyle];
[formatter setTimeStyle: NSDateFormatterMediumStyle];

各スタイルがNSDateFormatterMediumStyleの場合
日本(言語:日本 地域:日本):2019/02/28 16:00:00
英語(言語:English 地域:日本):Feb 28, 2019 16:00:00
英語(言語:English 地域:United States):Feb 28, 2019 at 4:00:00 PM

→日本は秒が増えた
 言語をアメリカ、地域は日本の場合は月の表示が英単語の短縮表記
 言語、地域をアメリカは月の表示が英単語の短縮表記でatを加えて時刻をAMPM表示

[formatter setDateStyle: NSDateFormatterLongStyle];
[formatter setTimeStyle: NSDateFormatterLongStyle];

各スタイルがNSDateFormatterLongStyleの場合
日本(言語:日本 地域:日本):2019年2月28日 16:00:00 JST
英語(言語:English 地域:日本):Februrary 28, 2019 16:00:00 JST
英語(言語:English 地域:United States):Februrary 28, 2019 at 4:00:00 PM GMT+9

→日本は/から年月日の表示になり、時刻の後ろにJST表記
 言語をアメリカ、地域は日本の場合は月の表示が英単語のフル表記、時刻の後ろにJST
 言語、地域をアメリカは月の表示が英単語のフル表記、時刻の後ろはGMT+9となった

[formatter setDateStyle: NSDateFormatterFullStyle];
[formatter setTimeStyle: NSDateFormatterFullStyle];

各スタイルがNSDateFormatterFullStyleの場合
日本(言語:日本 地域:日本):2019年2月28日 木曜日 16時00分00秒 日本標準時
英語(言語:English 地域:日本):Thursday, Februrary 28, 2019 at 16:00:00 Japan Standard Time
英語(言語:English 地域:United States):Thursday, Februrary 28, 2019 at 4:00:00 PM Japan Standard Time

→日本は曜日が加わり、時刻表機が時分秒に、JSTが日本標準時とフル表記となった
 言語をアメリカ、地域は日本の場合は曜日が加わり、JSTがJapan Standard Timeとフル表記
 言語、地域をアメリカは曜日が加わり、GMT+9からJapan Standard Timeに変化

★NSLocale systemLocaleに言語設定の方法を変更
[formatter setLocale:[NSLocale systemLocale]]; // システム設定の言語を設定する

各スタイルがNSDateFormatterShortStyleの場合
日本(言語:日本 地域:日本):2019-02-28 16:00
英語(言語:English 地域:日本):2019-02-28 16:00
英語(言語:English 地域:United States):2019-02-28 16:00

各スタイルがNSDateFormatterMediumStyleの場合
日本(言語:日本 地域:日本):2019 M02 28 16:00:00
英語(言語:English 地域:日本):2019 M02 28 16:00:00
英語(言語:English 地域:United States):2019 M02 28 16:00:00

各スタイルがNSDateFormatterLongStyleの場合
日本(言語:日本 地域:日本):2019 M02 28 16:00:00 GMT+9
英語(言語:English 地域:日本):2019 M02 28 16:00:00 GMT+9
英語(言語:English 地域:United States):2019 M02 28 16:00:00 GMT+9

各スタイルがNSDateFormatterFullStyleの場合
日本(言語:日本 地域:日本):2019 M02 28, Thu 16:00:00 GMT+09:00
英語(言語:English 地域:日本):2019 M02 28, Thu 16:00:00 GMT+09:00
英語(言語:English 地域:United States):2019 M02 28, Thu 16:00:00 GMT+09:00

iOS側はなんだこれは…
Localの方法の差異もそうだけど、言語と地域の組み合わせによって表示内容が変化する

systemLocaleで設定すると、言語と地域の組み合わせの影響はなくなるっぽいけど、表記がいまいちよくわからない
currentLocaleで設定した際は、上記のようになるっということだけ覚えておこう…

この記事へのコメント