Je crée une application mobile qui compte un compte à rebours à une date précise. Je pense que j'ai la minuterie elle-même correcte, mais je me débats pour l'obtenir dans un format où je peux l'affecter à mon étiquette. Je reçois une erreur "Impossible d'invoquer Initializer pour Type 'String' avec une liste d'arguments de type '(nsdatecomonents)'. Cette erreur est trouvée à la ligne" Var Date = String (Licongaveldate) ". La sortie de l'étiquette a été correctement créé dans ce fichier.
La première étape que j'ai prise était la création de la variable de date et la définition égale à la valeur convertie de mon autre variable. Deuxième étape impliquée en essayant de regarder à travers la documentation mais jusqu'à présent, je n'ai pas vraiment trouvé aucun Documentation substantielle pouvant aider. P>
func createGavelTimer() {
let openingGavelDate = NSDateComponents()
openingGavelDate.year = 2019
openingGavelDate.month = 7
openingGavelDate.day = 16
openingGavelDate.hour = 14
openingGavelDate.minute = 00
openingGavelDate.timeZone = NSTimeZone(abbreviation: "CST")! as TimeZone
var date = String(openingGavelDate) //problem is here
countdownLabel.text = date
}
3 Réponses :
Essayez de convertir le Aussi, comme @sh_khan et @RMADDY ont commenté, vous devez utiliser nsdatecomponents code> objet à un < Un href = "https://developer.apple.com/documentation/foundation/date" rel = "nfollow noreferrer"> date code> en utilisant calendar.date (à partir de :) code> , puis convertissant cela en un Chaîne code> à l'aide d'un DateFormatter code> : < Pré> xxx pré> datecomponents code>, TimeZone code>, etc., etc., au lieu de leur NS code> homologues (sauf si vous utilisez Swift 2 ou moins). P> p>
Utilisez DateFormatter Date d'affichage des dates. N'utilisez pas seulement la conversion de chaîne par défaut.
@Sulthan merci pour la suggestion, j'ai oublié dateformatter code>. Je vais mettre à jour ma réponse.
Deux choses que vous devez faire pour former votre date:
de la propriété CODE> de votre instance Datecomenents. LI>
ol> En outre, je vous recommande d'utiliser des identificateurs de fuseau horaire au lieu d'abréviation pour spécifier un fuseau horaire; L'avantage est que les identifiants appliqueront automatiquement des règles spéciales telles que l'économie de jour, le cas échéant. (Ci-dessous que j'ai substitué la zone "America / Chicago" pour UTC.) P>
Essayez ce code dans un terrain de jeu: p> xxx pré> sortie: 2019-07-16 19:00:00 +0000 code> (Votre date dans GMT.) P> Cela vous obtiendra une date, mais remarquez que la classe de date est imprimée dans GMT par défaut, Parce que date code> n'a pas de concept de fuseau horaire. p> à imprimer Date code> dans le fuseau horaire et au format souhaité, utilisez dateformatter code>: p> xxx pré> sortie: 2019-07-16 02:00 pm code> (votre heure et votre heure, en CST et formatées pour la lecture.) P > DateFormatter vous permet de contrôler vous-même le format ou de suivre les paramètres système de l'utilisateur pour déterminer ce qui se trouve dans la chaîne finale. Voir les docs pour DateFormatter CODE> pour voir comment l'obtenir dans le format que vous souhaitez afficher. P> p>
Votre format de date est faux. N'utilisez jamais aaaa code>. Utilisez aaaa code>. Et évitez de spécifier un fixeformat code>. Utilisez dentestyle code> et TIMTYLE code> chaque fois que vous affichez une date à un utilisateur, il est donc correctement localisé.
Il est également préférable d'éviter de créer des fuseaux horaires avec une abréviation. Ils ne sont pas uniques. Mais pourquoi définir le fuseau horaire du tout? Pourquoi ne pas montrer la date à l'heure locale?
@RMADDY Date Format String et TimeZone Création sont mis à jour.
Je laisse à l'astucieux de déterminer comment formater la date. J'ai présenté des dates à la fois (chaîne de format exacte ou styles basés sur les paramètres régionaux) en fonction du contexte.
Non, vous ne montrez qu'un moyen de formater une date code>. Le impression code> ne compte pas car ce n'est jamais un moyen valide pour afficher une date code> à un utilisateur.
Le fuseau horaire @Rmaddy est disponible pour jouer car cette application est destinée aux personnes partout dans tout le pays, lorsque l'heure spécifiée dans le compte à rebours est en temps central. Il y a une chance très forte que je fais ça mal comme je suis un débutant autodidacte à Swift, mais cela semblait être quelque chose à faire car il devrait en théorie compte à tout utilisateur, peu importe où ils sont
@Greguctum Si les composants que vous définissez sont spécifiques à un fuseau horaire fixe, il est logique de définir ce délai lors de la conversion des composants en une date code>. Que vous utilisiez ce même fuseau horaire ou non lors de la conversion de la date code> résultante code> à une chaîne que vous affichez sur l'utilisateur dépend de ce que vous souhaitez montrer à l'utilisateur.
Une solution possite:
let date = Calendar.current.date(from: openingGavelDate)
let dateFormatter = DateFormatter()
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .medium
dateFormatter.doesRelativeDateFormatting = true
dateFormatter.timeZone = TimeZone(abbreviation: "CST")!
let yourString = dateFormatter.string(from: date)
FYI - Pas besoin de définir le fuseau horaire code> sur code> sur TimeZone.current code> car c'est la valeur par défaut.
@RMADDY Merci pour le commentaire. Ceci est juste un échantillon. Je vais le changer en question - comme.