//创建日期来自一个api调用
var creationDate = "2020-11-04T16:46:59.439212Z"
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none
formatter.dateFormat = "dd-MM-yyyy"
var creationDateFormattedInToDate = formatter.date(from:
creationDate)
print("date (creationDateFormattedInToDate)")
所以我想要格式为04-11-2020的日期,并传入UITextField.text
您将需要两个格式化程序,一个将输入日期解析为date对象,另一个将日期对象转换为正确格式的字符串。
输入日期似乎是互联网日期/时间的变体,因此我们使用ISO8601DateFormatter
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
第二个格式化程序是具有自定义格式的基本DateFormatter
let outputFormatter = DateFormatter()
outputFormatter.dateFormat = "dd-MM-yyyy"
然后我们可以像这个一样使用它们
if let date = formatter.date(from: creationDate) {
someTextField.text = outputFormatter.string(from: date)
}
您将需要使用一个格式化程序来解析来自服务器的响应(它是所谓的"ISO 8601"或"RFC 3339"格式(,另一个用于在UI中准备日期的字符串表示。
关于解析服务器响应的日期格式化程序:
- 将格式化程序的
locale
设置为Locale(identifier: "en_US_POSIX")
- 如果要设置
dateFormat
,则解析此日期字符串时的样式设置无关紧要 - 解析字符串中的日期时,请将
dateFormat
设置为yyyy-MM-dd'T'HH:mm:ss.SSSSSSX
- 如果您计划使用此格式化程序进行反向日期到字符串转换(用于准备要发送到服务器的日期字符串(,则可能需要将格式化程序的
timeZone
设置为TimeZone(secondsFromGMT: 0)
关于用于在UI中准备日期字符串表示的日期格式化程序:
-
我不建议在您的UI中使用固定的
dd-MM-yyyy
格式。这对欧洲用户来说可能很自然,但对大多数美国用户来说可能不自然,他们通常希望在前一个月看到。 -
我建议不要将
dateFormat
用于第二个日期格式化程序,而是使用dateStyle
(例如.medium
或.long
(。它产生了一个漂亮的、本地化的、自然的阅读日期字符串。 -
如果您坚持在UI中使用
dd
、MM
和yyyy
,我会使用setLocalizedDateFormatFromTemplate
对其进行本地化,使日期和月份按照该特定用户期望的逻辑顺序显示(对于美国用户,月后接日,对于大多数其他地区,日后接月(。
因此:
let serverDateFormatter = DateFormatter()
serverDateFormatter.locale = Locale(identifier: "en_US_POSIX")
serverDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
serverDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"
let uiFormatter = DateFormatter()
uiFormatter.dateStyle = .medium // or uiFormatter.setLocalizedDateFormatFromTemplate("ddMMyyyy")
if let date = serverDateFormatter.date(from: creationDateString) {
let string = uiFormatter.string(from: date)
// use that `string` in your UI
}