我想将日期格式化为字符串,但它给了我零,我想在UITextField.text中使用日期



//创建日期来自一个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中使用ddMMyyyy,我会使用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
}

最新更新