格式化字符串到目前为止的意外结果

时间:2018-01-24 11:35:12

标签: swift

我已经格式化了一个基本转换的字符串,而且我的日期完全不同。

import UIKit

extension String {
    func toDate(dateFormat: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat
        return dateFormatter.date(from: self)!
    }
}

let date = "01/24/2018 09:59:24"

print(date.toDate(dateFormat: "MM/dd/YYYY hh:mm:ss"))

enter image description here

为什么它减少了大约一个月零一小时?

修改

import UIKit

extension String {
    func toDate(dateFormat: String) -> Date {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.date(from: self)!
    }
}

extension Date {
    func toString(_ format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.timeZone = TimeZone.current
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        return dateFormatter.string(from: self)
    }
}
let date = Date().toString("MM/dd/yyyy hh:mm:ss")
print(date)
print(date.toDate(dateFormat: "MM/dd/yyyy hh:mm:ss"))

RESULT

01/24/2018 12:48:33
2018-01-23 23:48:33 +0000

1 个答案:

答案 0 :(得分:1)

设置区域设置和时区以避免无效结果。扩展名的返回值应为Date?,因为字符串可能不是有效日期。 由于dateFormat不是可选的,因此它应该是有效的日期格式,有关详细信息,请参阅here

import UIKit

extension String {
    func toDate(dateFormat: String, locale : Locale? = nil, timezone: TimeZone? = nil) -> Date? { //locale and timezone are optional with a default nil value
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat 
        dateFormatter.locale = locale
        dateFormatter.timeZone = timezone
        return dateFormatter.date(from: self)
    }
}

您可以像这样使用它:

let string = "01/24/2018 09:59:24"
let myLocale = Locale(identifier: "en_US_POSIX")
let myTimeZone = TimeZone(abbreviation: "PCT")

print(string.toDate(dateFormat: "MM/dd/yyyy HH:mm:ss",
      locale: myLocale,
      timezone: myTimeZone))