web-dev-qa-db-fra.com

Swift 3 problème de fuseau horaire

Il semble que la méthode setDefaultTimeZone ne soit plus disponible dans NSTimeZone. Est-ce que quelqu'un connaît un substitut pour cela?

Ajout de quelques détails: Dans mon appDelegate.Swift, j'ai

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

et cela fonctionne comme prévu, je suppose, car dans tous les autres fichiers, NSTimeZone est défini sur cette valeur

Maintenant, dans mes utils, j'ai cette méthode

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
}

Alors, disons, je lui donne l'entrée "2016-10-07", il me redonne 2016-10-06 23:00. Pourquoi? Il est corrigé si vous décommentez la ligne dans le code ci-dessus. Je ne veux pas utiliser cette ligne partout. 

Par exemple, j'ai utilisé CVCalendar ( https://github.com/Mozharovsky/CVCalendar ) dans une autre partie de mon projet. Il fournit une fonction pour se convertirDate comme si

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

La même chose que précédemment se passe ici aussi ... c’est-à-dire que je clique sur 2016-10-08 et que cette date est sélectionnéeDate ici devient 2016-10-07 23:00.

Et NSTimeZone.Default imprime l’Europe/Londres partout. 

Quelqu'un a-t-il une idée de la raison pour laquelle cela se produit?

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

Essaye ça

7
Jitendra Modi

Essayez comme ça.

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

Edit: / J'ai utilisé cette TimeZone avec DateFormatter et obtenir l'heure BST correcte avec la date.

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)

Si vous voulez définir defaultTimeZone pour un objet NSTimeZone, vous pouvez le définir comme suit dans Swift 3.

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

Si vous utilisez le calendrier alors,

// * créer un objet de calendrier *

var calendar = NSCalendar.current

// * définir les composants du calendrier à utiliser également Timezone to 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)

Identificateur de région géopolitique identifiant le fuseau horaire.

identifiant de la variable publique: String {get}

Remarque : Si vous souhaitez définir le fuseau horaire du formateur de date, vous pouvez suivre l'approche ci-dessus comme suit:

dateFormatter.timeZone = TimeZone(identifier: "UTC")!
2
Wolverine