我有一种方法可以快速将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
对我在做什么错有任何想法吗?
答案 0 :(得分:1)
您的日期格式错误。
将字符串"3/10/16, 10:00AM"
与日期格式"MM/dd/yy HH:mm"
比较。有三个问题:
a
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)
其他人回答了您的问题,但有一些发现:
始终将您的IS8601时间戳字符串保存在GMT / UTC / Zulu时区(通过将ISO8601日期字符串格式化程序的timeZone
设置为TimeZone(secondsFromGMT: 0)
,也许添加{字符串中的{1}}限定词,以使其完全明确。它不应该是“服务器时区”,也可能也不应该是设备的本地时区。
更好的是,我建议使用X
,它会自动设置时区,语言环境等,从而使配置不那么脆弱。
我建议实例化两个单独的日期格式,一个用于ISO 8601日期格式(一个带有ISO8601DateFormatter
的日期格式),另一个用于在用户界面中显示日期。尽管ISO 8601日期格式化程序应使用T
语言环境(并且如果使用en_US_POSIX
,这将为您解决),但UI日期格式化程序则不应(因为您大概想在其中显示日期)用户设备的当前语言环境。
我个人建议您的模型对象不要使用字符串作为日期,而是使用ISO8601DateFormatter
对象。因此,在Date
和API字符串之间进行转换时,请使用ISO8601DateFormatter
,将Date
存储在模型对象中,并且仅将Date
与DateFormatter
和{{ 1}}在用户界面中显示dateStyle
时。
因此,这意味着您不需要使用两个字符串格式化程序,而是使用两个格式化程序中的每个字符串的最新日期(反之亦然)。
日期格式化程序的创建在计算上非常昂贵。因此,您可以考虑一次创建这两个格式化程序,将它们保存在ivars中,然后不必重复实例化。