Swift

2016-04-05 32 views
1

'daki bir ISO-8601 dizesinden gelen ofset değerini ayıklamak NSDateFormatter ile, bir ofset ile bir ISO-8601 tarih + saat değerini iletirse, ofseti okur ve çıkışı UTC değerine ayarlar. :Swift

// Setup 
let formatter  = NSDateFormatter() 
formatter.locale  = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 

// Test 
let input  = "2016-04-16 04:12:00-0800" 
let output = formatter.dateFromString(input) 
let outputStr = formatter.stringFromDate(output) 
print(outputStr) // "2016-04-15 08:12:00-0000" 

Şimdiye kadar çok iyi.

Ama bu ofset değerine kendim ulaşmak istiyorum. Uygulamam, tarih-zaman ofset bilgilerini koruyan bir web servisine yönelik bir istemcidir, bu yüzden aynı şeyi yapmalıyım (körü körüne outputStr'u web servisine geri döndürdüğüm gibi, ofset bilgisini kaybettim, böylece veritabanı ofsetin ne olduğunu bilmeyecek datetime toplandı zaman oldu.

NSDateFormatter sadece tarihleri ​​çıkış için saat dilimi bilgileri kabul görünüyor, bana sayısal bir giriş dizesi dışına ofset almak için bir yolu yoktur.

cevap

0

öz açıklayıcı 'örnek

Giriş dizesini herhangi biriyle değiştirirseniz
import Foundation 

let formatter  = NSDateFormatter() 
formatter.locale  = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ" 

// Test 
let input  = "2016-04-16 04:12:00-0800" 
let output = formatter.dateFromString(input) 

// with curent time zone (system default 
let outputStrL = formatter.stringFromDate(output!) 

// with time zone Z+0000 
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
let outputStr = formatter.stringFromDate(output!) 

// with time zone Z-0800 
formatter.timeZone = NSTimeZone(forSecondsFromGMT: -8 * 3600) 
let outputStr1 = formatter.stringFromDate(output!) 

print("My local time:", outputStrL) 
print("GMT+0000 time:", outputStr) 
print("GMT-0800 tume:", outputStr1) 

/* 
My local time: 2016-04-16 14:12:00+0200 
GMT+0000 time: 2016-04-16 12:12:00+0000 
GMT-0800 tume: 2016-04-16 04:12:00-0800 
*/ 

çıkış dizeleri (outputStr, outputStrL, outputStr1), ondan oluşturulan NSDate aynı değeri (zaman) temsil eder.

+0

Örneğiniz, belirli bir tarih dizgesinden + zaman değeriyle ilgili zaman dilimi ofsetini nasıl alabildiğimi göstermez. – Dai

+0

?? giriş dizginiz belirli bir zaman değerini temsil eder, AYNI DEĞERİ farklı zaman ofsetleri ile dizge olarak gösterilebilir. – user3441734

+1

Sadece giriş dizesini 'ayrıştırmak ve ondan -0800 almak istiyor musunuz? ya da temsil ettiği zamana ihtiyacınız var mı? – user3441734