Swift DateFormatter date from字符串在iPhone日期时返回nil&;时间24小时关闭
我正在开发一个应用程序,它根据从后端返回的字符串初始化日期。使用以下格式返回日期字符串:“2020-03-05T09:00:00+00:00” 我必须进行转换的方法是:Swift DateFormatter date from字符串在iPhone日期时返回nil&;时间24小时关闭,swift,Swift,我正在开发一个应用程序,它根据从后端返回的字符串初始化日期。使用以下格式返回日期字符串:“2020-03-05T09:00:00+00:00” 我必须进行转换的方法是: extension Date { static func convertDate(_ dateString: String?) -> Date? { guard let dateString = dateString else { return nil } let dateForm
extension Date {
static func convertDate(_ dateString: String?) -> Date? {
guard let dateString = dateString else { return nil }
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("yyyy-MM-dd'T'HH:mm:ssZZZZZ")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
return dateFormatter.date(from: dateString)
}
}
一切正常,直到有人报告说,如果用户在设置中关闭“24小时时间”,上述方法返回nil
我做错了什么
谢谢您使用的是非常标准化的时间戳格式,它允许您利用
ISO8601数据格式化程序
let dateString = "2020-03-05T09:00:00+00:00"
let df = ISO8601DateFormatter()
df.formatOptions = [.withInternetDateTime]
if let date = df.date(from: dateString) {
print(date) // 2020-03-05 09:00:00 +0000
}
如果一台机器(比如你的服务器)正在生成时间戳,那么它将(应该)始终在祖鲁时间(GMT)内,所以你不需要做任何超出此时间的事情。您可以指定一个时区,但没有一个点,因为字符串总是为您将其归零
df.timeZone = TimeZone(secondsFromGMT: 0)
此字符串表示时间上的绝对时刻。如果您需要一个相对的时间点,例如源代码中的本地时间,则需要标识该时区并将其应用于此处,这也是非常困难的。Hi,我已尝试运行此代码,但行“dateFormatter.setLocalizedDateFormatFromTemplate(Date.dateFormatterLocale)”出现错误,特别是dateFormatterLocale不是Date的成员。这是你在别处创造的吗?我试图将其更改为dateFormatter.locale,但这会导致另一个错误。您需要将dateFormatter区域设置为“en_US_POSIX”。使用固定格式日期(如RFC 3339)时,可以设置dateFormat属性以指定格式字符串。对于大多数固定格式,还应将locale属性设置为POSIX语言环境(“en_US_POSIX”),并将timeZone属性设置为UTC。对不起,你说得对。这是一个常量…Remove
dateFormatter.setLocalizedDataFormatFromTemplate
。你不需要它,如果你也从日期开始创建时间戳,你应该将你的时区设置为UTC,这肯定是一个重复的问题。有关StackOverflow的问题已经太多了。请注意,ISODateFormatter仅适用于iOS 11或更高版本。正如我在评论中提到的,默认设置应该可以工作df.formatOptions=[.withInternetDateTime]
使用此方法创建时间戳时,不需要它。结果字符串的时区表示形式将不同于原始字符串。它将使用Z表示UTC,而不是+00:00。它的意思相同,但不一致。问题已标记为重复,但ISO8601DateFormatter立即解决了问题。