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

公開日: : 最終更新日:2018/05/16 iPhoneアプリ開発

こんにちは、@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のように簡単にローカライズ対応できるので、うまく使っていきたいですね。

関連記事

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

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

【WWDC2018】iOSエンジニア的に気になる新機能・新APIまとめ

こんにちは、@akio0911です。 先日開催されたWW

【Swift】Codableで後からキーを追加した場合の挙動

こんにちは、@akio0911です。 SwiftのCod

現場での開発の全体像について学べる「現場のためのSwift4 Swift4.1+Xcode9.3対応」

著者の一人である @takashingsさんから、現場のためのSw

Touch Barを使うとショートカットを覚える必要が無くなって便利

こんにちは、@akio0911です。 今年の2月にTouch B

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

こんにちは、@akio0911です。 「2018年5月6日」「1

→もっと見る

PAGE TOP ↑