2017-10-28 9 views
-1

私はAndroid開発者であるiOS開発の初心者です。私は使用するのに慣れていますが、Joda-Timeライブラリのタイムゾーンを指定してdatetimeを保存するオブジェクトがあります。iOSでタイムゾーン付きのdatetimeを保存するには?

日付と時刻についてのiOSドキュメント(https://developer.apple.com/documentation/foundation/dates_and_times)を読んだ後、私はまだどのクラスを使って日付時刻を保存すべきか疑問に思っています。 Date/NSDateクラスの説明「特定の時点、カレンダーまたはタイムゾーンとは関係なく」それはタイムゾーンに依存しないため非常に役に立たないようであり、タイムゾーンなしの時間は意味を持たない。

私の本当の問題(TL; DR)

私は日付の時間がこの"YYYY-MM-DD HH:MM:SS" のようなUTCに格納されているデータベース持っを。私は任意のタイムゾーンに簡単に変換するDateFormatter( "yyyy-MM-dd hh:mm:ss"という形式の文字列)とタイムゾーン(UTC)のオブジェクトを初期化したいと思います。彼のデフォルトのタイムゾーン時間にユーザ)。 iOSでこれをどのように達成できますか?

編集:タイトルと開始時刻のクラスイベントがあるとします。タイトルは文字列です。開始時間はどのようにする必要がありますか?

+3

*「タイムゾーンなしの時間は意味をなさない」*と書かれています。それは間違ったプレーンです。もちろんそれは意味をなさない。 「日付」はある時点である。私が「今」と言えば、それは世界のすべての人にとって同じポイントです。タイムゾーンは、誰かが知りたいと思うようになるまで「時間帯の中で「今」は何時ですか?次に、 'Date'を与えられたタイムゾーンで' String'にフォーマットするだけです。 – rmaddy

+0

@rmaddy私はあなたに同意しなければならないかもしれません。誰かがあなたにこの時間の注釈 "1970-12-12 11:40:30"を与えると想像してください。あなたはそれがいつ始まったのか分かりません、それは決定的ではありません。あなたが何を記述しているかは、イベントの後に秒が渡されます。これはすべてのコンテキストで同じです。あなたはタイムゾーンと同じようなスタートポイントを与えなければなりません。 – Exprove

+0

しかし、文字列 "1970-12-12 11:40:30"は "日付"ではありません。それは文字列です。特定のタイムゾーンに基づいてその文字列を 'Date'に変換します。 'Date'を取得したら、それを保存します。後でそれを取得し、あなたはあなたが望む任意の時間帯のために再び 'Date'を文字列に変換することができます。それがポイントです。 'Date'オブジェクトには特定のタイムゾーンはなく、必要なものはありません。 – rmaddy

答えて

1

これにはDateFormatterを使用します。

let formatter = DateFormatter() 
formatter.calendar = Calendar(identifier: .iso8601) 
formatter.locale = Locale(identifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
formatter.timeZone = TimeZone(secondsFromGMT: 0) 

formatter.localeは、ユーザの現在のロケールを設定し、formatter.dateFormatは、所望の日付の書式を設定します。あなたのケースではyyyy-MM-dd HH:mm:ss。単にそれを呼び出すために

let utcDateFromServer = "2017-01-01 22:10:10" 
let date = formatter.date(from: utcDateFromServer) 
+0

私はdateformatterが私の問題(atleast "モデル"部分)を解決するとは思わない。私はあまり明確ではないかもしれません。タイトルと開始時刻のクラスイベントがあるとします。タイトルは文字列です。開始時間はどのようにする必要がありますか(私はほとんどそれがdateformatterではないと確信しています)? – Exprove

+0

@Exprove、更新された投稿をチェックアウトして、あなたがしたいことをより詳しく説明します。 –

0

Dateは、マニュアルの他のコメント&で述べたように、時間のポイントです。

ローカル時間にUTC時刻を変換したい場合は、まずDateFormatterを使用してDateにあなたのデータベースからString"yyyy-MM-dd hh:mm:ss"を変換する必要があります。その後

let dateStringUTC = "2018-01-01 00:00:00" 

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss" 
//Set the input timezone (if you don't set anything, the default is user's local time) 
dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
let date : Date = dateFormatter.date(from: dateStringUTC)! 

TimeZone

let outputDateFormatter = DateFormatter() 
outputDateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss" 
//Set the output timezone (if you don't set anything, the default is user's local time) 
//outputDateFormatter.timeZone = someTimeZone 
let dateString = outputDateFormatter.string(from: date) 

print(dateString) 

それぞれの出力でDateFormatterを使用してバックStringDateを変換:2017-12-31 17:00:00

そして、あなたはちょうど反対のことを行うには、入力と出力のタイムゾーンを変更することができます。

+0

元の文字列を 'Date'に変換するときに、フォーマッタのタイムゾーンを" GMT "に設定することはほとんどありません。ほとんどの場合、ユーザーのタイムゾーンが必要になる可能性があります。これは、解析しているローカル時間になる可能性が高いからです。 – rmaddy

+0

@rmaddy私は詳細情報を提供するために答えを編集しました。質問者がデータベースからローカルタイムゾーンにUTC/GMT日付を変換したいと考えているため、元の日付文字列がUTCであることを意味していました。 – LWJ

+0

@LWJタイトルと開始時刻のクラスイベントがあるとします。タイトルは文字列です。開始時間はどのようにする必要がありますか? – Exprove

関連する問題