2014-12-23 17 views
15

Veritabanında bir grup farklı gösterim süresine sahibim ve bir offset oluşturarak kullanıcıların saat dilimine göre doğru zamanı görüntülemek istiyorum.Swift'de Offset Ekleme

Kullanıcıları GMT'den saat dilimi ofsetini alıyorum ve bunu önce saatlere dönüştürüyorum. G/m mücadele nerede

NSTimeZone.localTimeZone().secondsFromGMT/60/60 

Sonra tarih nesnesine saat eklemek için bir yol bulmalıyız .. olmasıdır.

let formatter = NSDateFormatter() 
    formatter.dateFormat = "HH:mm" 

    let date = formatter.dateFromString(timeAsString) 
    println("date: \(date!)") 

Sonra kolay AM/PM ile okumak zorunda, bir etiket kullanmak için tarihten itibaren bir dize yaratıyorum.

formatter.dateFormat = "H:mm" 
    formatter.timeStyle = .ShortStyle 
    let formattedDateString = formatter.stringFromDate(date!) 
    println("formattedDateString: \(formattedDateString)") 

Sadece saatlerin nasıl ekleneceğini/çıkarılacağını öğrenemiyorum. Dizgiyi ikiye böldüm ama bazen negatif olur ve işe yaramaz. Belki bu konuda yanlış gidiyorum.

Yardımlarınız için teşekkür ederiz.

Keith

cevap

18

, sen elle NSDate/Date nesneleri ayarlama olamaz olmalıdır . Biçimlendirici ile uygun saat dilimlerini kullanmanız gerekir. Örneğin, Swift 3'te:

let gmtTimeString = "5:00 PM" 

let formatter = DateFormatter() 
formatter.dateFormat = "h:mm a" 
formatter.timeZone = TimeZone(secondsFromGMT: 0)   // original string in GMT 
guard let date = formatter.date(from: gmtTimeString) else { 
    print("can't convert time string") 
    return 
} 

formatter.timeZone = TimeZone.current      // go back to user's timezone 
let localTimeString = formatter.string(from: date) 

Veya Swift 2'de

: yanıtlarken için

let formatter = NSDateFormatter() 
formatter.dateFormat = "h:mm a" 
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) // original string in GMT 
let date = formatter.dateFromString(gmtTimeString) 

formatter.timeZone = NSTimeZone.localTimeZone()  // go back to user's timezone 
let localTimeString = formatter.stringFromDate(date!) 
+0

"NSDate nesnelerini el ile ayarlamamanız gerekir" - Altın! – TruMan1

4

Ben saat toplayıp çıkarmada dateByAddingTimeInterval fonksiyonunu kullanmak. Am veya pm'ye basmak için dateFormat dizesine bir ekleyin.

var showTimeStr = "00:00 PM" //show time in GMT as String 
let formatter = NSDateFormatter() 
formatter.dateFormat = "hh:mm a" 
let showTime = formatter.dateFromString(showTimeStr) 
showTime.dateByAddingTimeInterval(3600) //Add number of hours in seconds, subtract to take away time 
showTimeStr = formatter.stringFromDate(showTime) 
+1

teşekkürler. Ne koyduğunuz oldukça fazla çalışıyor, sadece opsiyonları eklemem gerekiyordu. Şimdi off-off 3600 izin offsetTime = NSTimeZone.localTimeZone(). SecondsFromGMT var ama ben "Int NSTimeInterval dönüştürülebilir değil" ofset koymak için çalışıyoruz bunu bir yolu var mı? – user3712837

+0

Teşekkürler. Çalıştıysa lütfen onaylayın ve doğru cevap olarak seçin. Yayınlamak için: 'off offsetTime = Int (NSTimeZone.localTimeZome(). SecondsFromGMT)'. Bunu yapmak işe yarayacaktır, ancak bunun aralığı keseceğini anlarsınız (örn. 83.96748, 83 değil 84 olur). Daha sonra çevirmek istiyorsanız, bu gönderinin cevabı: http://stackoverflow.com/questions/11121459/how-to-convert-nstimeinterval-to-int size yardımcı olacaktır. –

+0

Aslında 7 dakikayı çıkarır ve yanlış yapmazsam bu bağlantı gerçekten hızlı çalışmaz. – user3712837

1

İşte b.Morgans'ın cevabı ile birleştirilmiş son kodum. Artık hepsinin çalıştığına inanıyorum. Eğer GMT bir dize olarak depolanan bir gösteri zamanı dönüştürmek istediğiniz ve kullanıcının yerel saat diliminde göstermek istiyorsanız

let offsetTime = NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT) 

var showTimeStr = "05:00 PM" //show time in GMT as String 
let formatter = NSDateFormatter() 
formatter.dateFormat = "h:mm a" 
let showTime = formatter.dateFromString(showTimeStr) 
let finalTime = showTime?.dateByAddingTimeInterval(offsetTime) //Add number of hours in seconds, subtract to take away time 
showTimeStr = formatter.stringFromDate(finalTime!) 
+1

Genellikle bu şekilde doğru sonuca ulaşırsınız, ancak bu, temel bir yanlış anlaşılmaya bel bağlar. NSDate 'nesneleri.Örneğin, bu kod ile,' showTime' değişken 5 pm GMT değil, yerel saat diliminde 5 pm değil (benim için NY, 5 pm, 10 pm GMT). Emin, 'finalTime', ters 10 pm GMT'yi 5 pm GMT ile değiştirerek bu hatayı tekrar biçimlendirici olarak kullanmak için biçimlendiriciyi tekrar kullandığınızda, yerel saat diliminizde doğru şekilde gösterilen 5pm GMT değerini alırsınız.öğlen NY burada. Bu gereksiz yere kafa karıştırıcıdır (ve tam tarih dizgileri kullanmaya başlarsanız, bazen 24 saat kapalı kalırsınız). – Rob

+0

Teşekkürler bir ton Rob, bu mantıklı ve ben bunu doğru şekilde yapmak ve karışıklıktan kaçınmak istiyorum. – user3712837

+0

Evet, aslında tarihi de kullanıyorum. Temelde zaman ve ayrı tarih alanı için veritabanı içinde ayrı bir alan var, yani 2014-01-01. Ama belki ikisini de aynı anda kullanmalıyım ve ihtiyaç duyduğumda veritabanı içeriğini ayarlıyorum, böylece formatlamayı da önceden ayarlayabilirim. Yani evet temel olarak en iyi ne olursa olsun, ve sonuçta uygulamadaki bir etiket ve zaman olarak tarihe ihtiyacım var. Teşekkürler. – user3712837

İlgili konular