質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

5742閲覧

swiftでDateオブジェクトで現在の日時を生成した場合、1日前の日程になってしまう

KazutakaShimizu

総合スコア157

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/29 00:48

swiftでカレンダーアプリを作っており、Dateオブジェクトを使って現在日時を生成したいのですが、時間が9時間ほどずれてしまいます。
8月29日9時の段階で下記を実行すると

swift

1print(Date())

2017-08-29 00:00:00 +0000
となってしまいます。
おそらく簡単な問題だと思うのですが、初心者のためなにぶんよくわからず・・・。
恐縮ですがどなたかご教授いただけますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

出力結果

2017-08-29 00:00:00 +0000

の最後に +0000 とありますね。これはタイムゾーンを表していて、協定世界時(UTC、おおむねグリニッジ標準時 GMT と一致していて、イギリスでの時刻と同一) と、現在の地域との時差を表しています。+0000 ということは、これは UTC そのものです。
日本標準時(JST)は、UTC に比べて9時間先行(+0900)します。日本が午前9時のとき、イギリスは午前0時です。

つまり、この現在日時の生成自体は、誤ってはいないのです。タイムゾーンが UTC であるだけで。

基本的に Date オブジェクト自体は UTC のまま扱って、必要に応じて DateFormatter などでタイムゾーンを指定して変換する、というのが作法です。

投稿2017/08/29 01:04

編集2017/08/29 01:05
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KazutakaShimizu

2017/08/29 01:08

そうでしたか・・・。そもそも最初に設定したものは日本時間じゃないものが生成されるのですね。 ご丁寧に解説いただきありがとうございます。 ちなみにDateFormatterで変換する場合、DateからStringやStringからDateには変換できそうなのですが、DateからDateでタイムゾーンだけを変換することもできるのでしょうか・・・?
tacsheaven

2017/08/29 01:12

そういう用途なら Calendar オブジェクトを使ったほうが良いと思います。
KazutakaShimizu

2017/08/29 07:02

ありがとうございます! Calendarオブジェクトの方、調べてみたんですがちょっとよくわからず、下記のコードで試してみてもやはり9時間前の時間になってしまうのですが、アドバイスいただけないでしょうか・・・。 let locale = Locale(identifier: "ja_JP") var calendar = Calendar.current calendar.locale = locale print(calendar.date(from: calendar.dateComponents([.year, .month, .day, .hour, .minute], from: Date())))
tacsheaven

2017/08/29 08:14

locale ではなく timeZone を設定しましょう。(locale は表示方式を指定するものです) var calendar = Calendar.current calendar.timeZone = TimeZone(identifier: "Asia/Tokyo")!
KazutakaShimizu

2017/08/29 08:25

おお、ありがとうございます! 下記で実行したのですが、やはり9時間前の時間となってしまっておりまして、タイムゾーンの部分も+0000になってしまいます・・・、 var calendar = Calendar.current calendar.timeZone = TimeZone(identifier: "Asia/Tokyo")! print("hoge") print(calendar.date(from: calendar.dateComponents([.year, .month, .day, .hour, .minute], from: Date()))) →Optional(2017-08-29 08:19:00 +0000)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問