2016-10-07 12 views
6

Wydaje się, że metoda setDefaultTimeZone nie jest już dostępna w NSTimeZone. Czy ktoś zna substytut tego?Swift 3 wydanie strefy czasowej

Dodanie kilka szczegółów: W moim appDelegate.swift mam

 NSTimeZone.default = TimeZone(abbreviation: "BST")! 

i działa zgodnie z przeznaczeniem Chyba ponieważ we wszystkich innych plików, otrzymuję NSTimeZone ustawienie tej wartości

teraz moim Utils, mam tej metody

static func getDate(_ dateStr: String) -> Date { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd" 
    // dateFormatter.timeZone = TimeZone(abbreviation: "GMT") 
    let date = dateFormatter.date(from: dateStr)! 
    return date 
} 

więc, powiedzmy, daję mu wejście „2016-10-07”, to daje mi powrót 2016-10-06 23:00. Czemu? Poprawi się, jeśli odkomentujesz linię w powyższym kodzie. Nie chcę używać tej linii wszędzie.

Na przykład w innej części mojego projektu użyłem CVCalendar (https://github.com/Mozharovsky/CVCalendar). Zapewnia funkcję uzyskania convertedDate jak tak

func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) { 
    selectedDay = dayView 
    selectedDate = dayView.date.convertedDate()! 
} 

samo, co dzieje się tu przed zbyt ... to klikam na 2016-10-08 i SelectedDate tutaj staje 07.10.2016 23: 00.

A NSTimeZone.Default wyświetla wszędzie Europę/Londyn.

Czy ktoś ma pojęcie, dlaczego tak się dzieje?

+0

czy możesz pokazać ur wypróbowany kod –

+0

https://developer.apple.com/reference/foundation/nstimezone/odnieś ten dokument –

+0

@ Anbu.Karthik To jest to, czego używałem przed Swift3 w AppDelegate.swift. NSTimeZone.setDefaultTimeZone (TimeZone (skrót: "BST")!) – AmrataB

Odpowiedz

6
let locale = NSTimeZone.init(abbreviation: "BST") 
NSTimeZone.default = locale as! TimeZone 

Wypróbuj ten

+2

Nie ma potrzeby tworzenia instancji 'NSTimeZone', a następnie konwertowania jej na' TImeZone' zamiast tego możesz bezpośrednio tworzyć obiekt za pomocą 'TimeZone (skrót:)' jak moja odpowiedź. –

+1

Wiem, ale to trochę łatwe do zrozumienia –

9

Spróbuj tego.

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")! 

Edit: Użyłem tej TimeZone z DateFormatter i uzyskać prawidłowy BST czas z datą.

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")! 
let formatter = DateFormatter() 
formatter.timeZone = TimeZone.ReferenceType.default 
formatter.dateFormat = "yyyy-MM-dd HH:mm" 
let strDate = formatter.string(from: Date()) 
print(strDate) 

Jeśli chcesz ustawić defaultTimeZone dla NSTimeZone przedmiot następnie w Swift 3 można ustawić w taki sposób.

NSTimeZone.default = TimeZone(abbreviation: "BST")! 
+0

Sprawdź edytowaną odpowiedź. –

+0

@AmrataB Po ustawieniu tego 'NSTimeZone.default = Strefa czasowa (skrót:" BST ")!' Ustawiasz tylko domyślną strefę czasową, która nie używa go i Kiedy używasz dateFormatter ustawia inną strefę czasową, w innym przypadku może być używana systemowy lub lokalny. –

+0

@ArrataB Czy otrzymujesz to, co próbuję powiedzieć? –

1

Jeśli używasz kalendarza wtedy,

// * stworzyć kalendarz przedmiot *

var calendar = NSCalendar.current 

// * zdefiniować elementy kalendarza używać oraz strefy czasowej UTC *

let unitFlags = Set<Calendar.Component>([.hour, .year, .minute]) 
calendar.timeZone = TimeZone(identifier: "UTC")! 
/// Returns a time zone initialized with a given identifier. 
/// 
/// An example identifier is "America/Los_Angeles". 
/// 
/// If `identifier` is an unknown identifier, then returns `nil`. 
public init?(identifier: String) 

Identyfikator regionu geopolitycznego, który określa strefę czasową.

publiczny identyfikator var: String {get}

Uwaga: Jeśli chcesz, aby ustawić strefę czasową, datę formatyzatora, można wykonać powyższe podejście takiego:

dateFormatter.timeZone = TimeZone(identifier: "UTC")! 
Powiązane problemy