【iOS】X日やX時間などの文字列表現を簡単に作れる DateComponentsFormatter

公開日: : 最終更新日:2020/07/09 iOSアプリ開発

記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

こんにちは、@akio0911です。

「2018年5月6日」「19時13分」など日付や時刻の文字列表現を簡単に作れるDateFormatterというクラスがありますが、「5日」「8時間」「12分」など時間の量を表す文字列を簡単に作れるクラスも存在します。それが「DateComponentsFormatter」です。

使いかた

使いかたは簡単。DateComponentsFormatterのインスタンスを作成し、各種プロパティを適切に設定し、stringメソッドを呼び出すだけです。以下にいくつか例を挙げます。

秒数を指定して文字列を作る

string(from:) – DateComponentsFormatter | Apple Developer Documentation

TimeInterval型で秒数を指定し、それを表す文字列を作成します。

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [.minute, .second]
let timeInterval: TimeInterval = 60 * 5 + 15
print(formatter.string(from: timeInterval)!)
// 英語環境: 5 minutes, 15 seconds
// 日本語環境: 5分 15秒

DateComponentsから文字列を作る

string(from:) – DateComponentsFormatter | Apple Developer Documentation

DateComponentsで日・時・分などを指定し、それを表す文字列を作成します。

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [.day, .hour, .minute]
print(formatter.string(from: DateComponents(day: 5, hour: 7, minute: 12))!)
// 英語環境: 5 days, 7 hours, 12 minutes
// 日本語環境: 5日 7時間 12分

2つのDateの差から文字列を作る

string(from:to:) – DateComponentsFormatter | Apple Developer Documentation

2つのDate(from, to)を指定し、その差から文字列を作ります。

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [.day, .hour, .minute, .second]
let from = Date()
let to = from.addingTimeInterval(60 * 3 + 24)
print(formatter.string(from: from, to: to)!)
// 英語環境: 3 minutes, 24 seconds
// 日本語環境: 3分 24秒

スタイル指定

unitsStyle – DateComponentsFormatter | Apple Developer Documentation

unitsStyleプロパティを使うと、時間の量を文字列化する時の書式を指定することができます。

それぞれのスタイルについて、公式ドキュメントには以下のような説明があります。

  • spellOut: 時間の単位と量を記述するスタイル。
  • full: 時間の単位を表すスタイルで、数量は含まれません。
  • short: ユニットのスペルを短縮したスタイル。
  • brief: shortよりも短い、短縮された時間単位を使用するスタイル。
  • abbreviated: 時間の単位に対して最も省略されたスペルを使用するスタイル。
  • positional: 単位の位置を使用してその値を識別するスタイル。

以下、コードと出力例です。

func style(unitsStyle: DateComponentsFormatter.UnitsStyle) {
   let formatter = DateComponentsFormatter()
   formatter.unitsStyle = unitsStyle
   formatter.allowedUnits = [.day, .hour, .minute]
   print(formatter.string(from: DateComponents(day: 5, hour: 7, minute: 12))!)
}

func style() {
   style(unitsStyle: .spellOut)
   // 英語環境: five days, seven hours, twelve minutes
   // 日本語環境: 五日 七時間 十二分

   style(unitsStyle: .full)
   // 英語環境: 5 days, 7 hours, 12 minutes
   // 日本語環境: 5日 7時間 12分

   style(unitsStyle: .short)
   // 英語環境: 5 days, 7 hr, 12 min
   // 日本語環境: 5日 7時間 12分

   style(unitsStyle: .brief)
   // 英語環境: 5days 7hr 12min
   // 日本語環境: 5日7時間12分

   style(unitsStyle: .abbreviated)
   // 英語環境: 5d 7h 12m
   // 日本語環境: 5d7h12m

   style(unitsStyle: .positional)
   // 英語環境: 5d 7:12
   // 日本語環境: 5d 7:12
}

まとめ

DateComponentsFormatterを使うと、DateFormatterのように簡単にローカライズ対応できるので、うまく使っていきたいですね。

この記事を書いた人
あきお(@akio0911
派手髪iOSエンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

この記事が気に入ったら「いいね!」しよう

Twitterで更新情報をゲット!

PAGE TOP ↑