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

公開日: : 最終更新日:2018/05/16 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エンジニア、ブロガー。「プログラミングで人々を幸せに」をテーマに活動中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。 MAMORIO株式会社 技術顧問(インタビュー記事)、VISITS Technologies株式会社 技術顧問(インタビュー記事)。ブログ「卵は世界である」を運営。

関連記事

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

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

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

プログラミング未経験者向けのプログラミング入門連載記事を始めます

こんにちは、@akio0911です。 これからプログラミング未経

【RxSwift】BehaviorRelayとPublishRelayについてまとめてみた

こんにちは、@akio0911です。今回はRxSwiftのBe

【RxSwift】materialize, dematealizeを使ってみた

@toshi0383さんに教えていただいた、RxSwiftのm

【RxSwift】ストリームのcompletedをつぶす(消し去る)方法

RxSwiftで元々のストリームからcompletedをつぶす

【RxSwift】completedかerrorが流れてきたらsubscribeはdisposeされる

RxSwiftにおいて、completedかerrorが流れて

→もっと見る

PAGE TOP ↑