2017-04-07 9 views
0

次の問題があります。のは、私は、サーバーから次の形式で日時を含むいくつかの文字列を受け取ると仮定してみましょう:文字列からNSDateをUTCに変換せずに取得する方法

yyyy-MM-dd'T'HH:mm:ssxxxx 

これは、サーバの日付時刻であると私はそれがあるように、アプリケーションでそれを表示したいと思います。私は、日付時刻を受け取るのであれば:

04.07.2017 10:29:23 

が、私は変換しようとするたびに:

2017-04-07T10:29:23+ 02:00 

それがサーバー上で10:29:23 (08:29:23 UTC)

であると私は、アプリケーションでそれを表示したいということを意味します文字列をNSDateに変換します。サーバーのタイムゾーンに関する情報が失われるため、日付がUTCに変換されます。これは望ましくありません。今すぐ次のコードを使用します。

let formatter = NSDateFormatter() 
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601) 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxxx" 

let date = formatter.dateFromString(dateString) 

Swift(2.3)でどのように達成できますか?

ありがとうございます。

+1

コードは正しいです。日付を 'print'すると、UTCを取得します。遊び場で試してみてください。 2つのメモ: 'xxxx'は' Z'で置き換えることができ、日付文字列ではプラス記号とマイナス記号とタイムゾーン値の間にスペース文字を入れてはいけません。 – vadian

+0

お返事ありがとうございます。はい、私はそれが私にUTCを与えることを知っていますが、私が上に書いたように、私はこれを望んでいません。私はそれを受け取ったので、サーバーの日時を表示したい。だからサーバー上の時刻が10:00(UTC 8:00)の場合は、アプリケーションに10:00(アプリケーションのタイムゾーンとは関係なく)も表示したいと考えています。 – smq93

+1

タイムゾーンを無視する場合は、日付文字列からタイムゾーン情報を削除する必要があります(たとえば、 'replaceOccurrencesOfString'と' RegularExpression'オプションを使用)。 – vadian

答えて

0

あなたのヒントを使用して問題を解決しました。次のコード

は私の期待を満たしている:

let formatter = NSDateFormatter() 
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601) 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxxx" 

let timeZonePattern = "([+-]([01][0-9]):[0-5][0-9])$" // e.g. "+02:00" 
let regex = try! NSRegularExpression(pattern: pattern, options: []) 
let dateStringWithoutTimeZone = regex.stringByReplacingMatchesInString(dateString, options: [], range: NSMakeRange(0, dateString.characters.count), withTemplate: "Z") 

let date = formatter.dateFromString(dateStringWithoutTimeZone) 

はあなたのすべてをありがとう!

2

NSDateには、組み込みのタイムゾーンがありません。 printNSDateの場合は、の何かで印刷する必要があるため、GMTで印刷されます。しかし、日付自体にはタイムゾーンが含まれていないため、タイムゾーンは含まれません。彼らはタイムゾーンに依存しません。

特定のタイムゾーンで日付を印刷するには、を希望の形式とタイムゾーンで構成し、.stringFromDateを使用します。または、タイムゾーンを設定しないでください。デバイスのタイムゾーンとロケールに印刷されます(たとえば、「00:23 + 02:00にイベントが発生しました」というメッセージがCETユーザーに表示されます「23:23にイベントが発生しました」とESTユーザーに「イベントは6:23 PMに発生しました」と表示されます)。

残念ながら、日付フォーマッタは元の文字列(+02:00)のタイムゾーンを理解していますが、何らかの手段であなたに通知することはできません。したがって、NSDateを使用してサーバーと同じタイムゾーンでプリントしたい場合は、自分でタイムゾーンを決定したり、別のチャネル経由で通信したり、ハードコードする必要があります。

関連する問題