2017-08-13 3 views
2

C'est la configuration de formatter date:Comment supprimer 'at' d'une chaîne de date formatée?

let dateFormatter = DateFormatter() 
dateFormatter.dateStyle = .medium 
dateFormatter.timeStyle = .medium 

Sortie prévue:

Aug 13, 2017 6:04:11 PM 

Sortie courant:

Aug 13, 2017 at 6:04:11 PM 

Comment le Arobase mot être supprimé idéalement sans spécifier un format chaîne et d'où vient-elle?

Avec locale allemande autrichienne:

dateFormatter.locale = Locale(identifier: "de_AT") 
13.08.2017, 18:04:11 

Avec locale anglais américain:

dateFormatter.locale = Locale(identifier: "en_US") 
Aug 13, 2017 at 6:04:11 PM 
+3

Quelle est votre locale actuelle? Ou utilisez-vous aussi la propriété 'dateFormat'? – vadian

+0

@vadian Je viens de prolonger l'affichage avec les informations sur les paramètres régionaux. Le 'at' semble provenir du lieu anglais. Je n'utilise pas la propriété dateFormat. –

Répondre

-3

Vous pouvez obtenir le résultat attendu en utilisant

dateFormatter.dateFormat = "MMM dd, yyyy h:mm:ss a". Le mot at est placé là en raison de la locale actuelle, donc si vous voulez vous en débarrasser pour tous les paramètres régionaux, vous devez spécifier le format de date exact comme vous pouvez le voir ci-dessus.

+0

Cela donnerait 'août. 13, 2017 6:22:48 PM' pour les paramètres régionaux allemands, qui ne "regardent pas" correctement :) –

+4

Il est difficile de coder en dur un format de date et d'heure spécifique. Cela entraîne une date et une heure très inattendues pour la plupart des utilisateurs dans divers paramètres régionaux. – rmaddy

-3

Vous pouvez écrire à une chaîne et utiliser text.Replace pour le remplacer par rien.

+3

Cela ne fonctionnerait que pour certains paramètres régionaux. La chaîne peut, par exemple, être '13.08.2017, 18: 18: 33' dans la langue allemande. –

2

Une option serait de faire deux conversions distinctes, l'une mise uniquement dateStyle = .medium, et un seul paramètre timeStyle = .medium et concaténer le résultat. Mais je ne sais pas si un format

<date><space><time> 

sens dans toutes les langues et les locales.

Une meilleure approche consiste à utiliser setLocalizedDateFormatFromTemplate:

dateFormatter.setLocalizedDateFormatFromTemplate("MMM dd yyyy jj:mm:ss") 

Cela se rapproche de ce que vous vouliez, et est garanti pour donner un résultat raisonnable pour tous les paramètres régionaux. Voici quelques exemples.

 
en_US: Aug 13, 2017, 6:33:54 PM 
de:  13. Aug. 2017, 18:33:54 
ja:  2017年8月13日 18:33:54 

Notez l'utilisation d'un format jj pour l'heure, cela sera interprété comme HH (format 24 heures) ou hh (format 12 heures AM/PM), en fonction des paramètres régionaux .

+0

Ça a l'air bien! Mais je voudrais éviter de spécifier une chaîne de format et de savoir d'où vient "at". –

+0

@AndrasHatvani Alors s'il vous plaît répondez à la question postée par vadian juste en dessous de votre question. – rmaddy

+0

@AndrasHatvani: Le "at" fait partie des paramètres régionaux. (NS) DateFormatter utilise finalement la "bibliothèque ICU pour Unicode". La partie pertinente pourrait être 'ures_getStringByIndex (dateTimePatterns.getAlias ​​(), glueIndex, & resStrLen, & status);' dans http://source.icu-project.org/repos/icu/trunk/icu4c/source/i18n/smpdtfmt.cpp . Je ne sais pas si cette "colle" est configurable, mais j'en doute. –