在Swift中将日期格式化为SQL日期格式

时间:2019-08-12 12:43:20

标签: swift date-formatting

我有一种方法可以快速将SQL日期转换为“ MM-dd-yyyy,HH:mm”。我需要能够将其转换回“ yyyy-MM-dd'T'HH:mm:ss”。这将是服务器时间以及东部时区。

转换为“ MM-dd-yyyy,HH:mm”:

  static func dateView(_ DateString: String) -> String {
        var returnDate = ""
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US_POSIX")
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
        let string = String(DateString)
        if let date = dateFormatter.date(from: string) {
            dateFormatter.dateStyle = .short
            dateFormatter.timeStyle = .short
            returnDate = dateFormatter.string(from: date)
        }

    return returnDate
}

尝试转换为“ yyyy-MM-dd'T'HH:mm:ss”:

static func dateToSQLDate(_ DateString: String) -> String {
    var returnDate = ""
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "MM/dd/yy HH:mm"
    let string = String(DateString)
    if let date = dateFormatter.date(from: string) {
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
        //dateFormatter.timeStyle = .short
        returnDate = dateFormatter.string(from: date)
    }

    return returnDate
}

示例为:

var date = "3/10/16, 10:00AM"
dateToSQLDate(date)
Expected Out: 2016-03-10T10:00:00

对我在做什么错有任何想法吗?

3 个答案:

答案 0 :(得分:1)

您的日期格式错误。

将字符串"3/10/16, 10:00AM"与日期格式"MM/dd/yy HH:mm"比较。有三个问题:

  • 缺少逗号
  • 缺少AM / PM说明符a
  • 12小时模式为hh

static func dateToSQLDate(_ string: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "MM/dd/yy, hh:mma"
    guard let date = dateFormatter.date(from: string) else { return "" }
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    return dateFormatter.string(from: date)
}

答案 1 :(得分:0)

尝试一下

static func dateToSQLDate(_ DateString: String) -> String {
    var returnDate = ""
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    let string = String(DateString)
    if let date = dateFormatter.date(from: string) {
    dateFormatter.dateFormat = "MM/dd/yy HH:mm"
        returnDate = dateFormatter.string(from: date)
    }    
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

    return returnDate
}

答案 2 :(得分:0)

其他人回答了您的问题,但有一些发现:

  1. 始终将您的IS8601时间戳字符串保存在GMT / UTC / Zulu时区(通过将ISO8601日期字符串格式化程序的timeZone设置为TimeZone(secondsFromGMT: 0),也许添加{字符串中的{1}}限定词,以使其完全明确。它不应该是“服务器时区”,也可能也不应该是设备的本地时区。

  2. 更好的是,我建议使用X,它会自动设置时区,语言环境等,从而使配置不那么脆弱。

  3. 我建议实例化两个单独的日期格式,一个用于ISO 8601日期格式(一个带有ISO8601DateFormatter的日期格式),另一个用于在用户界面中显示日期。尽管ISO 8601日期格式化程序应使用T语言环境(并且如果使用en_US_POSIX,这将为您解决),但UI日期格式化程序则不应(因为您大概想在其中显示日期)用户设备的当前语言环境。

  4. 我个人建议您的模型对象不要使用字符串作为日期,而是使用ISO8601DateFormatter对象。因此,在Date和API字符串之间进行转换时,请使用ISO8601DateFormatter,将Date存储在模型对象中,并且仅将DateDateFormatter和{{ 1}}在用户界面中显示dateStyle时。

    因此,这意味着您不需要使用两个字符串格式化程序,而是使用两个格式化程序中的每个字符串的最新日期(反之亦然)。

  5. 日期格式化程序的创建在计算上非常昂贵。因此,您可以考虑一次创建这两个格式化程序,将它们保存在ivars中,然后不必重复实例化。