2015-07-20 11 views
5

Dizeden bir NSDate nesnesi oluşturuyorum.SWIFT: NSDate nesnesine saatlerimi nasıl eklerim

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT") 
let stringToDate = dateFormatter.dateFromString(dateFromService) // 2015-07-20 12:00:43 +0000 

Bu dize değerini web sunucusundan alıyorum. Kişisel cihaz saat dilimi için değiştirmem gerekiyor. kütüphane, hangi SwiftMoment (aynı .js kütüphanede esinlenerek) aşağıdakileri yapmak için izin verir (ve çok daha fazlası denilen hours Bu stringToDate nesnesi eklemek ancak daha sık yapıyorsanız değil

var addHours : Int = 2 // 2 hours will be added 
var newDate = stringToDate.dateByAddingTimeInterval(addHours) 
+2

2 saniyeliğine değil 2 saniye ekliyor gibi görünüyor. timeInterval her zaman saniye cinsindendir. veya NSDate bileşenlerini kullanabilirsiniz. 'Int = Saat * 60 * 60' –

+1

ekle 'tarih ve saati ayarlamak için' NSDateComponents' kullanmalısınız. –

+0

Evet, saniyeler ekliyor. 'NSTimeInterval' saniyeyi temsil eder. –

cevap

8

Yanlış soru soruyorsunuz. Bu, "XY Problem" olarak bilinen şeydir. "Kullanıcının yerel saat diliminde bir web sunucusundan aldığım bir tarih dizesini nasıl görüntülerim?" Bir saat dilimi içermeyen bir formda bir tarih/saat temsil eder.

Görüntülemek için belirli bir saat dilimine dönüştürüyorsunuz. Zaman dilimleri için ofsetlemek için bir NSDate'e saat eklemeyi/çıkarmayı denemeyin. Bu yanlış bir yaklaşım.

Doğru cevap basittir. İkinci bir tarih biçimlendirici oluşturun ve saat dilimini GMT'ye ayarlamayın. Kullanıcının yerel saat dilimine göre varsayılan değerdir. Eğer bu işlevi kullanabilirsiniz hızlı 3 için

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT") 
let date = dateFormatter.dateFromString(dateFromService) 

let outputDatedateFormatter = NSDateFormatter() 
outputDatedateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
//leave the time zone at the default (user's time zone) 
let displayString = outputDateFormatter.stringFromDate(date) 
println("Date in local time zone = \(displayString)") 
+1

İkinci son satırınız bazı Objective-C sözdizimi içeriyor :) –

+0

Ve bir noktalı virgül eksikti. :) – nhgrif

+0

zamanımı kurtardı, işe yaradı – Mehmet

0

çalışmak, kontrol etmek ister !):) Eğer Int.minutes vb Int.hours, aldığım şeydir bir NSTimeInterval değerini sarar ki (süre iken

// Create date using moment library 
let myDate = moment(myString) 

// Add one hour 
let dateWithAddedHour = myDate + 1.hours 

Moment NSDate örneği etrafında bir sarıcı vardır.

Bunu uygulamak sadece bir dakika sürecektir! (Pun amaçlı).

13

Kullanım NSCalendarComponents:

saat sıçrama, artık saniye gibi şeyler için hesap verecek NSCalendar kullanma
let calendar = NSCalendar.currentCalendar() 
let newDate = calendar.dateByAddingUnit(
    .CalendarUnitHour, // adding hours 
    value: 2, // adding two hours 
    toDate: oldDate, 
    options: .allZeros 
) 

vb

Ancak dışarıda Duncan C's answer puan, basitçe saat ekleyerek kesinlikle yanlış bir yaklaşımdır olarak. İki zaman dilimi her zaman aynı miktarda ayrılmayacaktır. Yine, bu, gün ışığından tasarrufları hesaba kattığımızda özellikle doğru bir şeydir. (Örneğin, ABD, Avrupa ile aynı günlerde gün ışığından yararlanma/kaydetme başlatmaz ve Arizona, gün ışığından tasarruf etmemektedir).

+0

NSCalendar ve arkadaşlarını kullanma konusunda genellikle haklısınız.Ancak: "Atılım saatleri" DST geçişlerine işaret ediyorsa, bu yalnızca * gün * ve daha büyük birimler için bir sorun, iki saat değil. Ve atlama saniye genellikle Unix zaman tarafından göz ardı edilir, NSDateComponents kullanırsanız veya bir NSTimeInterval eklerseniz, herhangi bir fark yaratmaz. –

+0

Hmm, evet. Ama 'NSCalendar' kullanmanın başka sebepleri var. Nihayetinde daha okunabilir bir şey… ve yazmayı alışkanlık haline getiriyor, böylece sorgulanamaz bir şekilde * konuya * girdiğinde, yanlış anlamıyorsunuz. – nhgrif

+0

Elbette. Esas olarak "NSCalendar vb. Hataların saniyeler için hesaplanması gerektiğini" argümanının yanlış olduğunu belirtmek istedim. –

0

...

// ekleyerek saat sonraki tarihi almak fonk

getNewDateAfterAddingHours (hoursToAdd: NSInteger, oldDate: Tarih) -> Int64

{

let calendar = Calendar.current 
    let newDate = calendar.date(byAdding: .hour, value: hoursToAdd, to: oldDate) 
    return Int64((newDate?.timeIntervalSince1970)!) 
}