Swift 我想将日期格式化为字符串,但它给了我零,我想在UITextField.text中使用日期
//creationdate来自一个api调用Swift 我想将日期格式化为字符串,但它给了我零,我想在UITextField.text中使用日期,swift,Swift,//creationdate来自一个api调用 var creationDate = "2020-11-04T16:46:59.439212Z" let formatter = DateFormatter() formatter.dateStyle = .long formatter.timeStyle = .none formatter.dateFormat = "dd-MM-yyyy" var cre
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您将需要两个格式化程序,一个用于将输入日期解析为日期对象,另一个用于将日期对象转换为正确格式的字符串 输入日期似乎是internet日期/时间的变体,因此我们使用ISO8601数据格式化程序
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
第二个格式化程序是具有自定义格式的基本日期格式化程序
let outputFormatter = DateFormatter()
outputFormatter.dateFormat = "dd-MM-yyyy"
然后我们可以像这样使用它们
if let date = formatter.date(from: creationDate) {
someTextField.text = outputFormatter.string(from: date)
}
您需要使用一个格式化程序来解析来自服务器的响应(这是所谓的and“ISO 8601”或“RFC 3339”格式),另一个格式化程序用于准备UI中日期的字符串表示形式 关于解析服务器响应的日期格式化程序:
- 将格式化程序的
设置为locale
locale(标识符:“en_US_POSIX”)
- 如果要设置
,则解析此日期字符串时的样式设置是不相关的dateFormat
- 从字符串解析日期时,将
设置为dateFormat
yyyy-MM-dd'HH:MM:ss.ssssss x
- 如果计划使用此格式化程序进行反向日期到字符串转换(用于准备要发送到服务器的日期字符串),则可能需要将格式化程序的
时区设置为
时区(secondsFromGMT:0)
- 我不建议在用户界面中使用固定的
格式。这对欧洲用户来说可能是自然的,但对大多数美国用户来说可能是不自然的,他们通常希望在一天的前一个月看到dd-MM-yyyy
- 我建议不要为第二个日期格式化程序使用
,而是使用dateFormat
(例如dateStyle
或.medium
)。它产生了一个漂亮的、本地化的、自然的读取日期字符串.long
- 如果您坚持在您的UI中使用
和dd
和MM
,我会使用yyyy
对其进行本地化,以使日期和月份按照该特定用户期望的逻辑顺序显示(对于美国用户,月后接日,对于大多数其他地区,月后接日)setLocalizedDateFormatFromTemplate
格式
“dd-MM-yyyy”
与字符串“2020-11-04T16:46:59.43921z”
不匹配。甚至还没有结束。谢谢,不知什么原因,我被Xcode中的自动完成愚弄了,以为我不能只写。使用分数秒,但重新启动后再试一次,效果很好(我使用的是测试版:)。很高兴知道丢失的精度,但我想在这种情况下它并没有那么重要。@JoakimDanielson您可能也会丢失DateFormatter的精度,但它会增加000来填补空白。您只需要一个S
,它将解析尽可能多的小数秒(限制为3秒)。唯一的区别是在创建日期字符串时。如果您添加3个以上的SSS,它将用零填充。我想知道为什么他们没有添加一个选项来指定ISO8601DateFormatter的小数秒精度。它可能在引擎盖下使用DateFormatter,否则他们不会将其固定为3位。如果我可能使用格式化程序进行反向转换,我希望指定所需的毫秒数,以防服务器对格式有特殊要求。(这就是为什么我没有使用ISO8601DateFormatter
)这可能不是问题,但似乎是最佳实践,IMHO。但每个人都有自己的。
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
}