您好,我需要更改日期格式
我收到类似后端的回复
dob =“ 1989-03-06T00:00:00Z”;
就我而言,我编写了以下代码,但我的应用程序崩溃了,我认为我当前的日期格式不正确。
func DateFromWebtoApp(_ date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
let date = dateFormatter.date(from: date)
dateFormatter.dateFormat = "MM-dd-yyyy"
return dateFormatter.string(from: date!)
}
请查看日期字符串。没有毫秒(S
),并且Z
是格式说明符(没有单引号)。
此外,对于任意日期格式,总是添加固定的Locale
func dateFromWebtoApp(_ dateString: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let date = dateFormatter.date(from: dateString)
dateFormatter.dateFormat = "MM-dd-yyyy"
return dateFormatter.string(from: date!)
}
尝试一下,它在我这边工作。
func DateFromWebtoApp(_ date: String) -> String
{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
let date = dateFormatter.date(from: date)
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.timeZone = .current
return dateFormatter.string(from: date!)
}
由于输入日期字符串为ISO投诉日期格式,因此可以使用ISO8601DateFormatter
。
func dateFromWebtoApp(_ inDate: String) -> String? {
let inFormatter = ISO8601DateFormatter()
if let date = inFormatter.date(from: inDate) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
return dateFormatter.string(from: date)
}
return nil
}
由于构造日期格式化程序有些昂贵,因此可能值得在函数外部声明它们,并尽可能保留它们。
日期格式化程序众所周知在创建时需要大量的计算。更改dateFormat
也很昂贵。因此,我建议您先声明两个日期格式化程序属性,并将它们实例化一次,并且只能实例化一次。
let isoDateFormatter = ISO8601DateFormatter()
let dobFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter
}()
首先,isoDateFormatter
用于将字符串从后端转换为Date
对象。通过使用ISO8601DateFormatter
,您将不必再手动为locale
配置DateFormatter
。
[第二个,dobFormatter
用于将出生日期Date
对象转换为要在您的UI中显示的字符串。对于第二个格式化程序,请注意:
我不使用dateFormat
,而是使用dateStyle
(因此,该结果符合特定设备的日期本地化首选项,英国用户将看到“ 1989年3月6日”,而美国用户将看到“ 3月6日, 2019”)。如果确实要查看英国用户的.short
和美国用户的.medium
,请使用dd/MM/yy
而不是MM/dd/yy
。但是我个人喜欢中型格式,因为它既简洁又简洁。其中,如果有空间,我会使用长格式,该格式最自然地表示日期(例如,“ 2019年3月6日”,而不是“ 2019年3月6日”)。执行您的UI要求。
但是如果要呈现给最终用户,您确实应该避免使用硬编码的日期格式字符串,因为用户希望以与他们的个人设备范围内的本地化设置一致的方式查看日期,而不是一个或另一个应用程序喜欢。而且没有理由将您的应用限制在美国用户使用,因为有朝一日您可能想吸引更多的受众。
我将此输出格式化程序的时区设置为GMT,因为此字符串表示日期,而不是组合的日期/时间。例如,1989-03-06T00:00:00Z
(格林尼治标准时间1989年3月6日午夜)翻译为3月5日美国加州时间下午4点。但是,当您提出生日时,您想说的是3月6日,而不是3月5日。简而言之,您想忽略时间和时区信息。您可以使用GMT / UTC / Zulu作为输出日期格式程序来执行此操作。
无论如何,您将像这样使用它:
let input = "1989-03-06T00:00:00Z"
if let dob = isoDateFormatter.date(from: input) {
let output = dobFormatter.string(from: dob)
}