-3
votes

Affectation de NSDatEcomponents à une étiquette

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
}


0 commentaires

3 Réponses :


0
votes

Essayez de convertir le nsdatecomponents objet à un < Un href = "https://developer.apple.com/documentation/foundation/date" rel = "nfollow noreferrer"> date en utilisant calendar.date (à partir de :) , puis convertissant cela en un Chaîne à l'aide d'un DateFormatter : < Pré> xxx

Aussi, comme @sh_khan et @RMADDY ont commenté, vous devez utiliser datecomponents , TimeZone , etc., etc., au lieu de leur NS homologues (sauf si vous utilisez Swift 2 ou moins).


2 commentaires

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 . Je vais mettre à jour ma réponse.



0
votes

Deux choses que vous devez faire pour former votre date:

  1. Définissez un calendrier sur l'instance Datecoments.
  2. Obtenez votre date en accédant à la propriété de la propriété de votre instance Datecomenents.

    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.)

    Essayez ce code dans un terrain de jeu: xxx

    sortie: 2019-07-16 19:00:00 +0000 (Votre date dans GMT.)

    Cela vous obtiendra une date, mais remarquez que la classe de date est imprimée dans GMT par défaut, Parce que date n'a pas de concept de fuseau horaire.

    à imprimer Date dans le fuseau horaire et au format souhaité, utilisez dateformatter : xxx

    sortie: 2019-07-16 02:00 pm (votre heure et votre heure, en CST et formatées pour la lecture.)

    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 pour voir comment l'obtenir dans le format que vous souhaitez afficher.


7 commentaires

Votre format de date est faux. N'utilisez jamais aaaa . Utilisez aaaa . Et évitez de spécifier un fixeformat . Utilisez dentestyle et TIMTYLE 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 . Le impression ne compte pas car ce n'est jamais un moyen valide pour afficher une date à 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 . Que vous utilisiez ce même fuseau horaire ou non lors de la conversion de la date résultante à une chaîne que vous affichez sur l'utilisateur dépend de ce que vous souhaitez montrer à l'utilisateur.



1
votes

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)


2 commentaires

FYI - Pas besoin de définir le fuseau horaire sur sur TimeZone.current 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.