2017-10-06 10 views
1

Je suis confronté à un problème que timeIntervalSince1970 renvoie la mauvaise année.timeIntervalSince1970 conversion renvoie la mauvaise année dans Swift 3

Voici mon code

func unixToDateString(timeStamp: TimeInterval) -> String { 
    let date = Date(timeIntervalSince1970: timeStamp) 
    let dateFormatter = DateFormatter() 
    dateFormatter.locale = Locale(identifier:Locale.current.identifier) 
    dateFormatter.dateFormat = "MM/dd/YYYY" 
    return dateFormatter.string(from: date) 
} 

et ce sont mes résultats

unixToDateString(timeStamp: 1505896961.0) 

retours

09/20/2017 

qui est correct

mais,

unixToDateString(timeStamp: 1546214400.0) 
unixToDateString(timeStamp: 4133894400.0) 

retours

12/31/2019 
12/31/2101 

ils ont tous deux reviennent Appoint Un an selon Epoch Unix Time Stamp Converter

1546214400.0 = 12/31/2018 
4133894400.0 = 12/31/2100 

Quelqu'un at-il la même situation?

Répondre

1

Le problème est que le format de date utilise "Année (de" Semaine de l'année ")" (YYYY) mais le résultat que vous attendez est "Année civile" (yyyy). Après avoir changé le format de la date en "MM/dd/yyyy", je vois les résultats que vous attendez (les années 2018 et 2100).


Vous pouvez voir à la fois Y et y répertoriés dans le Unicode Standard Date Field Symbol Table. Dans leur exemple, l'année de la «semaine de l'année» (1997) est également une de plus que l'année civile (1996).

Le Data Formatting Guide apporte également le même problème et souligne que l'on devrait normalement utiliser la date du calendrier (yyyy):

Une erreur courante consiste à utiliser YYYY. yyyy spécifie l'année civile tandis que YYYY spécifie l'année (de la "Semaine de l'année") utilisée dans le calendrier ISO-semaine. Dans la plupart des cas, yyyy et YYYY donnent le même nombre, mais ils peuvent être différents. En règle générale, vous devez utiliser l'année civile.

+0

Merci beaucoup et les détails :) Vous avez résolu mon problème –