Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift DateFormatter date from字符串在iPhone日期时返回nil&;时间24小时关闭_Swift - Fatal编程技术网

Swift DateFormatter date from字符串在iPhone日期时返回nil&;时间24小时关闭

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

我正在开发一个应用程序,它根据从后端返回的字符串初始化日期。使用以下格式返回日期字符串:“2020-03-05T09:00:00+00:00”

我必须进行转换的方法是:

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立即解决了问题。