NSDate の内容をなるべく手軽に表示する

Swift プログラミング

NSDate の内容を画面に表示しようとしたのですけど、そのまま description を使ってみると世界標準時で表示されてしまって手直しが必要な様子でした。

書式文字列を使う方法だと調整にけっこう気を使うので、今回はなるべく手軽に日時を表示する方法を探してみました。

あるアプリで最後にデータを読み込んだ日時を表示したくて NSDate の内容を画面に表示しようとしたのですけど、NSDatedescriptionプロパティ を使うだけだと 2015-11-09 03:22:38 +0000 というような表記になって、そのまま使うにはつらい結果になりました。

パッと見るとそこまで悪くはなさそうですけど、でも時刻が世界標準時間になっていて、そのまま表示するには親切ではないし、むしろ世界標準時間との誤差の分だけ間違えて読んでしまいそうです。

descriptionWithLocale を使用する方法

そこで、日本標準時間で表示させる方法を探してみたところ、まずはとてもシンプルな次の方法が見つかりました。

let date = NSDate()
let locale = NSLocale.currentLocale()

let string = date.descriptionWithLocale(locale)

ただ、この方法を使った場合は 平成27年11月9日月曜日 12時25分05秒 日本標準時 というように、随分と長い表現で日付が表示される様子です。

とりあえず表示したいときとか、しっかりとした日本語表記で表示したい場合には向いていそうですけど、ちょっとした更新日みたいなのを表示するにはなんとなく大げさにも思えます。

descriptionWithCalendarFormat を使用する方法

もうひとつ、NSDate に用意されている descriptionWithCalendarFormat:timeZone:locale: を使う方法もありそうでした。

NSDate().descriptionWithCalendarFormat("%Y-%m-%d %H:%M:%S", timeZone: nil, locale: nil)!

このようにすると 2015-11-09 12:49:28 というように表示されてくれるので、最終更新日を表示するみたいな、とりあえず日時を伝えられれば十分みたいな場合には良い感じに扱えるように見えます。

ただ、どうやらこのメソッドは OS X 10.10 で非推奨になったみたいなので、今から使うにはちょっと問題ありそうです。

NSDateFormatter を使用する方法

日付を文字列に変換するときに同じみな方法としては NSDateFormatter を使用する方法があります。それについては以前にも調べて NSDate を文字列に変換する というページで簡単に記したことがありました。

ただ、そのときみたいな dateFormat を指定して加工する方法だと、システムの時刻設定が西暦か和暦かとか、24 時間表記かみたいな、ときに環境に大きく左右されることがあって上手くいかないことが多く、何かと気を遣うところでした。

指定する書式も 日付フォーマット yyyy と YYYY の違い - 強火で進め で紹介されているように繊細な動きを見せたりするみたいで、これはなかなか安易に使うと火傷しそうです。

書式文字列を使わずに文字列化する

今回は更新日を伝えることが目的なので、そんな手間をもっと軽減できないかと調べてみたところ、次の方法を使うことで良い感じに文字列化できそうなことがわかりました。

let date = NSDate()
let formatter = NSDateFormatter()

formatter.calendar = NSCalendar.currentCalendar()
formatter.dateStyle = NSDateFormatterStyle.ShortStyle
formatter.timeStyle = NSDateFormatterStyle.MediumStyle

let string = formatter.stringFromDate(date)

こうすることで H27/11/09 13:06:29 みたいな表示が、難しい書式指定なしで出来るようになりました。

今回は秒数を表示したくて timeStyleNSDateFormatterStyle.MediumStyle にしていますけど、秒数が必要なければ NSDateFormatterStyle.ShortStyle にすれば良さそうです。

また、今回の例では年数表記が和暦になっていますけど、そもそもシステム設定で和暦が採用されているからこうなっているので、これが問題になることはないはずです。


この方法ならプログラマーが意図的に加工するものはないので、思わぬ表示のされ方をするみたいなことは起こらなそうで、今回みたいな更新日時の表示にはぴったりかもしれません。

そもそも NSDate を単純に表示するのに NSDateFormatter という別のオブジェクトを持ち出さないといけないところが面倒に感じたりするかもしれないですけど、個人的には『日付を表現するデータ』と『日付を文字列化する機能』とをこうして分けた方が、それぞれの役割が明確になって良いかなって思います。その上で、今回みたいな書式文字列を指定しない書き方ができるのは、シンプルで良いなって感じました。