2017-08-30 3 views
0

J'essaie simplement de transformer un objet Date lorsqu'un utilisateur a "24 heures" activé sur leur iPhone dans un objet de date "12 heures".Convertir 24 heures date objet en 12 heures date objet

J'ai essayé comme indiqué dans les discussions précédentes à ce sujet, mais je l'ai pas eu de chance:

objet initial de finalDate: Date 30/08/2017 22:00:00 UTC

let dateFormatter = DateFormatter() 
dateFormatter.locale = Locale(identifier:"en_US") 
dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 
let dateString = dateFormatter.string(from: finalDate) 
let theFinalConvertedDate = dateFormatter.date(from: dateString) 

ce que je finis avec:

theFinalConvertedDate Date? 2017-08-30 22:00:00 UTC 

Je ne sais pas pourquoi cela se produit co nsidering que dateString imprime être:

"08/30/2017 5:00 PM"  

Il ne convertit d'abord à la sortie attendue, mais finit par être theFinalConvertedDate date? 2017-08-30 22:00:00 UTC

+1

Comme d'autres l'ont dit, aucune conversion 'Date' n'est nécessaire, car les objets' Date' n'ont pas le format "24 heures" contre "12 heures". C'est uniquement une question de comment vous voulez que la chaîne de sortie 'DateFormatter' soit formatée. Mais quel est le but de cette chaîne 'theFinalConvertedDate'? S'agit-il de la présentation dans l'interface utilisateur ou de l'envoi à un service Web ou à un stockage persistant local? La bonne réponse à cette question dépend de l'utilisation ultime de cette chaîne. – Rob

Répondre

1

Cela n'a absolument pas de sens d'essayer de changer le format d'un objet Date. Un Date n'a pas de format. Vous obtenez uniquement une chaîne dans un format souhaité en utilisant DateFormat pour convertir le Date en String.

La consignation d'un Date affiche toujours la valeur de date dans le fuseau horaire UTC avec un format fixe.

Tout ce que vous avez besoin est:

let dateFormatter = DateFormatter() 
dateFormatter.locale = Locale(identifier:"en_US_POSIX") 
dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 
let dateString = dateFormatter.string(from: finalDate) 

dateString est la valeur que vous aimez. Ce sera dans le format désiré.

Et notez que vous devez utiliser en_US_POSIX pour vous assurer que le résultat n'est pas affecté par les paramètres d'heure de l'utilisateur sur le périphérique iOS.

+0

Je me sens comme un idiot complet. Merci rmaddy! – jenniferDWG

+1

rmaddy, je sais que vous le savez, mais je le mentionne pour les futurs lecteurs: N'utilisez les paramètres régionaux 'en_US_POSIX' que si le but de la chaîne est d'interagir avec le service Web et/ou le stockage persistant. Si vous présentez la date à l'utilisateur final, ce serait une très mauvaise idée. Mais si pour le service web ou le stockage persistant, utiliser 'en_US_POSIX' est une excellente approche (mais si c'était le cas, le choix de ce format MM/jj/aaaa h: mm a' vs ISO 8601/RFC 3999 est très bizarre). – Rob

+1

@Rob Pour ajouter à cela, je dirais que pour toute date/heure étant montré à l'utilisateur, vous devriez rarement utiliser 'dateFormat'. Vous devez utiliser une combinaison souhaitée de 'dateStyle' et' timeStyle'. – rmaddy