這是一個兩步過程,第一轉換1900-01-01T00:00:00
(被稱爲RFC 3999或ISO 8601的日期,稱爲定義該格式的規格)爲Date
對象,然後轉換該Date
對象回字符串在的01-01-1900
形式:
將字符串轉換在1900-01-01T00:00:00
形式爲Date
對象,你可以使用ISO8601DateFormatter
:
let formatter = ISO8601DateFormatter()
formatter.formatOptions.remove(.withTimeZone)
let date = formatter.date(from: string)!
這相當於以下DateFormat
,其中一個必須手動設置locale
到en_US_POSIX
(因爲RFC 3999/ISO 8601日期使用公曆,無論使用什麼設備的默認日曆類型),並將timeZone
到GMT /祖魯語,因爲通常RFC 3999/ISO 8601個日期表示GMT,除非另有規定:
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = formatter.date(from: string)!
有關的時區和語言環境的重要性更多信息,解析RFC 3999和ISO 8601的日期,看到蘋果的Technical Q&A 1480。
然後,該Date
對象轉換爲一個字符串轉換爲01-01-1900
(日,月,年),你會使用的dd-MM-yyyy
格式字符串(請注意大寫MM
爲「月」,將其從mm
區分對於 「分」):
let formatter2 = DateFormatter()
formatter2.dateFormat = "dd-MM-yyyy"
let string = formatter2.string(from: date)
兩個關於dateFormat
字符串意見:
如果這個字符串顯示到t他可以使用用戶dateStyle
而不是dateFormat
,例如,:
formatter2.dateStyle = .short
雖然這會產生稍微不同的格式,例如dd/MM/yy
,這種方法的優點是字符串將被本地化(例如,英國用戶將看到MM/dd/yyyy
,他們看到短日期的首選方式)。
它只是取決於您的dd-MM-yyyy
格式的目的。如果是出於內部目的,請繼續使用dateFormat
。但如果是在UI中顯示日期,請改用dateStyle
,並享受DateFormatter
爲您自動執行的本地化。有關更多信息,請參閱DateFormatter
reference中的「使用用戶可見的日期和時間表示」部分。
請注意,在沒有爲此第二個格式化程序指定的timeZone
時,它會假定ISO 8601日期爲GMT,而您希望在當地時區中查看日期。例如,(1900-01-01T00:00:00
GMT是1899年12月31日下午4點在加利福尼亞州)。如果您想查看原始ISO 8601對象的日期字符串(未針對時區進行更正),則只需將此第二個格式化程序的timeZone
設置爲GMT即可。
formatter2.timeZone = TimeZone(secondsFromGMT: 0)
正如其他人所指出的那樣,要避免不必要的重新實例化DateFormatter
對象。所以,你可能會放在這些屬性格式化被實例化一次,或者使用extension
:
extension DateFormatter {
static let customInputFormatter: ISO8601DateFormatter = {
let formatter = ISO8601DateFormatter()
formatter.formatOptions.remove(.withTimeZone)
return formatter
}()
static let customOutputFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
formatter.timeZone = TimeZone(secondsFromGMT: 0) // if you want date in your local timezone, remove this line
return formatter
}()
}
然後:
let input = "1900-01-01T00:00:00"
let date = DateFormatter.customInputFormatter.date(from: input)!
let output = DateFormatter.customOutputFormatter.string(from: date)
print(output)
來源
2017-06-23 18:13:13
Rob
首先,您需要將字符串轉換到一個'Date'所以你需要一個匹配的日期格式。沒有列出的人甚至接近匹配諸如「1900-01-01T00:00:00」之類的字符串。 – rmaddy
「我正在嘗試一些類似的格式」:你可能有更好的機會在抽獎。一個提示?把日期字符串寫在你的格式上,儘量匹配它。例如「」EEE,...「永遠不會匹配它,並閱讀每個字母或其中的幾個意思是什麼意思http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html# Date_Format_Patterns另一個提示:將你的字符串分成多個部分,並試圖找到每個部分的格式。 – Larme