BLOG

ブログ

2024/04/08 技術系

【Swift】NTPサーバからKronosを使って現在日時を取得する方法について

この記事を書いた人 T.O

こんにちは、T.Oと申します。
SwiftでiOSアプリを開発中に、iOS端末からではなくNTPサーバから正確な現在日時を取得する必要があり、その時に使用したライブラリ「Kronos」のご紹介をいたします。

検証環境

  • Apple M2
  • macOS 13.2.1
  • Xcode 14.2
  • Swift Package Manager

iOS端末から日時情報を取得する方法

ライブラリを使わずにiOS端末から取得する方法は以下の通りです。

// iOS端末情報から現在の日時を取得
let date = NSDate()
let format = DateFormatter()
formatter.dateFormat = "HH:mm:ss"
label.text = format.string(from: date as Date)

iOS端末から日付を取得しフォーマットをかけて表示しています。
通常使う分ではこの方法で問題ないのですが、iOS端末の日付を変更した場合は変更後の日付が返ってきてしまい、正確な現在の日時を取得できません。

NTPサーバからの取得方法

Kronosの導入

  • KronosはSwift Package Managerからインストール可能です。

Clock.sync()のクロージャに、取得後の処理を書くことで、NTPサーバから返ってきた結果を表示することができます。

// NTPサーバから現在の時刻取得
Clock.sync { now, offset in
    let format = DateFormatter()
    format.dateFormat = "yyyy-MM-dd HH:mm"
    self.label.text = format.string(from: now as Date)
}

NTPサーバの指定がない場合は、デフォルトで time.apple.comが使用されます。
以下のようにNTPサーバを指定することも可能です。

// NTPサーバ指定
Clock.sync(from: "ntp.nict.jp")

まとめ

通常使う分、iOS端末の時間を取得する方法で問題ないのですが、外部から正確な時間を取得する場合にKronosを使えば容易に取得可能です。Kronosを使えば、接続するNTPサーバを指定できるので、国ごとにNTPサーバを変更することが可能です。



株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ