将日期格式化为 sql Swift 中的日期格式

Formating date to sql date formate in Swift

我有一种方法可以将我的 SQL 日期转换为 swift 中的 "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

对我做错了什么有什么想法吗?

试试这个

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
}

你的日期格式有误。

将字符串 "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. 始终将 IS8601 时间戳字符串保存在 GMT/UTC/Zulu 时区(通过将 ISO8601 日期字符串格式化程序的 timeZone 设置为 TimeZone(secondsFromGMT: 0),可能是谨慎的做法也许在字符串中添加 X 限定符以使其完全明确。它不应该是“服务器时区”,也可能不应该是设备的本地时区。

  2. 更好的是,我可能建议改用 ISO8601DateFormatter,它会自动设置时区、区域设置等,使配置不那么脆弱。

  3. 我建议实例化两个单独的日期格式化程序,一个用于 ISO 8601 日期格式(一个带有 T),另一个用于在 UI。虽然 ISO 8601 日期格式化程序应该使用 en_US_POSIX 语言环境(如果你使用 ISO8601DateFormatter,那是为你处理的),UI 日期格式化程序不应该(因为你可能想在用户设备的当前语言环境中显示日期)。

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

    因此,这意味着对于两个格式化程序中的每一个,您都拥有从字符串到最新(反之亦然)的字符串到最新例程,而不是两个字符串到字符串例程。

  5. 众所周知,创建日期格式化程序的计算成本很高。所以你可以考虑一次性创建这两个formatter,保存在ivars中,以后就不用再重复实例化了。