見出し画像

【徒然iOS】気ままにUIKit45〜日時の扱い方〜

概要

このマガジンは四十を過ぎたおっさんが、

を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。

今回

をレッツゴ🕺

前準備

念の為、

  1. バックアップ

  2. 新しいクラス

  3. ビューコントローラの追加

  4. イニシャルビューの変更

をいつも通りやってから本題へ💃

こんな感じかな

本題

今回は文字が多いので、まあ、読み物として読んでもらえればいいかなと。

⒈まあ、以下のコードを参考に組み込もう

//
// 現在日時を表示する。
//
 
import UIKit
 
var testDate = NSDate()
var testFormatter = NSDateFormatter()
 
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP")
 
//フォーマットのスタイルを設定する。
testFormatter.dateStyle = .MediumStyle
testFormatter.timeStyle = .MediumStyle
 
print(testFormatter.stringFromDate(testDate))
 
//実行結果
//2016/04/26 20:34:38

てことでこれっていきなりPlaygroundでの実行になってるっぽいので、
それで〜〜〜〜

図のように新しいPlaygoundをクリック
適当に〜〜〜そのままNext
選択先も適当に〜〜〜
Playgroundが開いたら、今回のコードを組み込んで左下の実行ボタン(▷)を押すと、、、
たくさん、赤エラーが出てくるので〜〜〜
毎度お馴染みのFixで直せるところをまずは改修して
.MediumStyleだけは直らないので

以下のコードみたいに修正すると、、、

//
// 現在日時を表示する。
//
var testDate = NSDate()
var testFormatter = DateFormatter()
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") as Locale
//フォーマットのスタイルを設定する。
testFormatter.dateStyle = .medium
testFormatter.timeStyle = .medium
print(testFormatter.string(from: testDate as Date))
てな感じで、実行できた🕺
てな感じらしい

⒉フォーマットを指定して日時を取得する。

次はこのコードだね👀

//
// 現在日時を表示する。
//
import UIKit
var testDate = NSDate()
var testFormatter = NSDateFormatter()
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP")
//フォーマットを設定する。
testFormatter.dateFormat = "yyyy年MM月dd日(E) a h:mm:ss.SSS"
print(testFormatter.stringFromDate(testDate))

こんな感じ

//
// 現在日時を表示する。
//
var testDate = NSDate()
var testFormatter = DateFormatter()
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP") as Locale
//フォーマットのスタイルを設定する。
testFormatter.dateStyle = .medium
testFormatter.timeStyle = .medium

testFormatter.dateFormat = "yyyy年MM月dd日(E) a h:mm:ss.SSS" //正直、ここだけ追加すればいい

print(testFormatter.string(from: testDate as Date))

で、コードを1行追加するだけ

実行結果が変わったね
てか、Formatterはシンプルにフォーマットを指定するだけだから、長々コードを書くより
変更部分だけを追加した方がわかりやすい
はこんな感じらしい👀

ま、以下もコードを書き換えてPlaygroundで実行するだけの内容みたいだから、書き換えと実行の例だけ書いておく

⒊文字列をNSDateに変換する

//
// 文字列をNSDateに変換する。
//
import UIKit
var testFormatter = NSDateFormatter()
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP")
//フォーマットを設定する。
testFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
//文字列をNSDateに変換する。
let testDate = testFormatter.dateFromString("2016/04/21 21:00:00")
print(testFormatter.stringFromDate(testDate!))

のコードを

サンプルコードの引数名が重複してるので2重宣言エラーに当然なる
小見出し⒊って意味で3を後ろにつけてやれば問題なく、2重宣言は回避できる👀
ま、慣れてる人には当たり前の話なんだけど💦
結構、初めてやる人はこれが思いつかなかったりする

で⒈と同じように、

//
// 文字列をNSDateに変換する。
//
var testFormatter3 = DateFormatter()
//ロケールを設定する。
testFormatter3.locale = NSLocale(localeIdentifier:"ja_JP") as Locale
//フォーマットを設定する。
testFormatter3.dateFormat = "yyyy/MM/dd HH:mm:ss"
//文字列をNSDateに変換する。
let testDate3 = testFormatter3.date(from: "2016/04/21 21:00:00")
print(testFormatter3.string(from: testDate3!))

改修すると、、、

出力できた🕺

⒋日時に時間を加算する

//
// dateByAddingTimeIntervalメソッド
// 日時に時間を加算する。
//
import UIKit
var testFormatter = NSDateFormatter()
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP")
//フォーマットを設定する。
testFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
//文字列をNSDateに変換する。
var testDate = testFormatter.dateFromString("2016/04/21 21:00:00")
//日時を表示
print(testFormatter.stringFromDate(testDate!))
//3600秒を加算
testDate = testDate!.dateByAddingTimeInterval(3600)
//日時を表示
print(testFormatter.stringFromDate(testDate!))

⒈と⒊で説明した手順で改修後のコード

//
// dateByAddingTimeIntervalメソッド
// 日時に時間を加算する。
//
var testFormatter4 = DateFormatter()
//ロケールを設定する。
testFormatter4.locale = NSLocale(localeIdentifier:"ja_JP") as Locale
//フォーマットを設定する。
testFormatter4.dateFormat = "yyyy/MM/dd HH:mm:ss"
//文字列をNSDateに変換する。
var testDate4 = testFormatter4.date(from: "2016/04/21 21:00:00")
//日時を表示
print(testFormatter4.string(from: testDate4!))
//3600秒を加算
//testDate4 = testDate4!.dateByAddingTimeInterval(3600)
testDate4 = testDate4!.addingTimeInterval(3600) //改修後
//日時を表示
print(testFormatter4.string(from: testDate4!))
ハイ、出力できた🕺

⒌日時の時間差を求める

//
// timeIntervalSinceNow、timeIntervalSinceDateメソッド
// 日時の時間差(秒)を求める。
// 
import UIKit
var testFormatter = NSDateFormatter()
//ロケールを設定する。
testFormatter.locale = NSLocale(localeIdentifier:"ja_JP")
//フォーマットを設定する。
testFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
//日時を作成
let testDate = testFormatter.dateFromString("2016/05/21 21:00:00")
//現在時刻からの時間差(秒)を求める。
let zikansa_now = testDate?.timeIntervalSinceNow
print(zikansa_now!)
//日時を作成
let testDate2 = testFormatter.dateFromString("2016/05/21 21:01:00")
//2つの日時の時間差(秒)を求める。
let zikansa = testDate2?.timeIntervalSinceDate(testDate!)
print(zikansa!)

を参考に👀
これまでに説明した方法で改修したやり方で直したコード

//
// timeIntervalSinceNow、timeIntervalSinceDateメソッド
// 日時の時間差(秒)を求める。
//
var testFormatter5 = DateFormatter()
//ロケールを設定する。
testFormatter5.locale = NSLocale(localeIdentifier:"ja_JP") as Locale
//フォーマットを設定する。
testFormatter5.dateFormat = "yyyy/MM/dd HH:mm:ss"
//日時を作成
let testDate5 = testFormatter5.date(from: "2016/05/21 21:00:00")
//現在時刻からの時間差(秒)を求める。
let zikansa_now = testDate5?.timeIntervalSinceNow
print(zikansa_now!)
//日時を作成
let testDate2 = testFormatter5.date(from: "2016/05/21 21:01:00")
//2つの日時の時間差(秒)を求める。
//let zikansa = testDate2?.timeIntervalSinceDate(testDate5!)
let zikansa = testDate2?.timeIntervalSince(testDate5!)
print(zikansa!)
ハイ、完了🕺

⒍ブラッシュアップ

とまあ、サイト記事の内容はここまでなんだけど、、、

//ロケールを設定する。
testFormatter5.locale = NSLocale(localeIdentifier:"ja_JP") as Locale

で見てもわかるとおり、今のモダンなコードの書き方に合わせて

じゃあ最初っからLocaleを使えばいいじゃん


って感じなので、、、さらにコードを改修🕺

てな感じで直して、、、
実行結果も問題なしを確認🕺

今回のコード(まとめ)

import UIKit
//
// 現在日時を表示する。
//
var testDate = NSDate()
var testFormatter = DateFormatter()
//ロケールを設定する。
testFormatter.locale = Locale(identifier:"ja_JP")
//フォーマットのスタイルを設定する。
testFormatter.dateStyle = .medium
testFormatter.timeStyle = .medium
testFormatter.dateFormat = "yyyy年MM月dd日(E) a h:mm:ss.SSS" //正直、ここだけ追加すればいい
print(testFormatter.string(from: testDate as Date))
//
// 文字列をNSDateに変換する。
//
var testFormatter3 = DateFormatter()
//ロケールを設定する。
testFormatter3.locale = Locale(identifier:"ja_JP")
//フォーマットを設定する。
testFormatter3.dateFormat = "yyyy/MM/dd HH:mm:ss"
//文字列をNSDateに変換する。
let testDate3 = testFormatter3.date(from: "2016/04/21 21:00:00")
print(testFormatter3.string(from: testDate3!))
//
// dateByAddingTimeIntervalメソッド
// 日時に時間を加算する。
//
var testFormatter4 = DateFormatter()
//ロケールを設定する。
testFormatter4.locale = Locale(identifier:"ja_JP")
//フォーマットを設定する。
testFormatter4.dateFormat = "yyyy/MM/dd HH:mm:ss"
//文字列をNSDateに変換する。
var testDate4 = testFormatter4.date(from: "2016/04/21 21:00:00")
//日時を表示
print(testFormatter4.string(from: testDate4!))
//3600秒を加算
//testDate4 = testDate4!.dateByAddingTimeInterval(3600)
testDate4 = testDate4!.addingTimeInterval(3600) //改修後
//日時を表示
print(testFormatter4.string(from: testDate4!))
//
// timeIntervalSinceNow、timeIntervalSinceDateメソッド
// 日時の時間差(秒)を求める。
//
var testFormatter5 = DateFormatter()
//ロケールを設定する。
testFormatter5.locale = Locale(identifier:"ja_JP")
//フォーマットを設定する。
testFormatter5.dateFormat = "yyyy/MM/dd HH:mm:ss"
//日時を作成
let testDate5 = testFormatter5.date(from: "2016/05/21 21:00:00")
//現在時刻からの時間差(秒)を求める。
let zikansa_now = testDate5?.timeIntervalSinceNow
print(zikansa_now!)
//日時を作成
let testDate2 = testFormatter5.date(from: "2016/05/21 21:01:00")
//2つの日時の時間差(秒)を求める。
//let zikansa = testDate2?.timeIntervalSinceDate(testDate5!)
let zikansa = testDate2?.timeIntervalSince(testDate5!)
print(zikansa!)

今回のポイント

サイト記事が7年前と古いので、NS系=Objective-Cの書き振りでコードは書いているけど、AppleがSwiftを開発した理由

Objective-Cが使いにくいってのがあって、Apple自体がよりモダンで直感で書きやすいコードとしてSwiftは開発してる

ってのがあるので、

Objective-C当時の書き振りは、現在のコードに直しておく

理由は簡単

常に進化し続けてるのがスマホアプリ開発言語だから、
とりあえず動けばいいで、直しておかないと

いざ動かなくなった時に、一気にコードを改修し直さないといけなくなって、さらに結合が強いと、実行エラーとか様々な影響があって、
阿鼻叫喚な回収になりがちだから。
👉どうしても使わないといけない時以外、今時、Objective-Cのコードなんて使わないし、使ってもFoundationをインポートしてやるくらい

ま、だから

他の記事

で折りに触れて、
今時、Objective-Cなんてやらないし、Objective-CからUIKitへの移行(マイグレーション)する現場なんて、マジ、余計な労力をかかる方法を自分たちから選んでやってるから

マゾじゃないかな?

と言ってる次第。
ま、日本の企業は階段型で、

Objective-C→UIKit→SwiftUI

みたいな構図を描きがちな頭でっかちが多いからね。

Objective-Cから移行するならUIKitすっ飛ばして、SwiftUIでやった方がいい。

Apple公式

さて、次回は

を、レッツゴ🕺

この記事が気に入ったらサポートをしてみませんか?