我想要"yyyy-MM-dd HH:mm:ss"
,时间为24小时格式,但由于我的手机中设置了12小时的日期格式,时区设置为马斯喀特,我得到的日期总是12小时格式,而我正在与英国地区核实。我可以将Date()
更改为24小时格式的字符串,但当我将24小时字符串更改为24时日期时,它总是给我12小时日期格式
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let dateToString = dateFormatter.string(from: Date()) //2020-04-06 15:47:16
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let dateFromString = dateFormatter.date(from: dateToString)
print(dateFromString) // 2020-04-06 1:47:25 pm +0000
Date
对象只表示一个时间点。Date
对象不知道"我应该在12小时还是24小时内显示它"。这是由DateFormatter
生成(或消耗(的字符串的特征。
所以,有几个想法:
-
日期格式化程序的
dateFormat
(及其locale
(指示调用string(from:)
时字符串的样子。(当您调用date(from:)
时,它还将指示如何解释字符串并创建Date
对象,但这与此处无关。(因此,如果您正在使用24小时时钟寻找日期的字符串表示,请查看日期格式化程序的
string(from:)
方法生成的字符串。这是示例中的dateToString
字符串。 -
但是,如果随后从格式化程序的
date(from:)
方法生成Date
对象,则生成的Date
将不会捕获是否使用12小时与24小时时钟。如果您print
此Date
对象,它将不会反映您的12/24小时时钟偏好。
最重要的是,在查看由DateFormatter
生成(或传递给(的String
对象时,只关注上午/下午与24小时时钟。打印Date
对象时,不要担心输出的格式,因为这仅用于调试目的,不会捕获上午/下午与24小时的时钟维度。
你说:
最后一句话是给我"2020-04-09 4:23:27 am+0000"的格式。
如果您看到+0000
,则表明您正在打印Date
对象本身。DateFormatter
的dateFormat
和locale
仅控制由string(from:)
生成的字符串的格式(以及如何解析字符串(。
因此,打印由DateFormatter
生成的字符串,而不是Date
对象。Date
对象的打印将始终采用此预定义格式。在应用程序中,如果需要给定格式的输出,请使用DateFormatter
生成的String
,而不是Date
对象。
考虑一个更明显的问题示例,其中DateFormatter
用于创建一个格式非常不同的字符串:
let now = Date()
print(now) // 2020-04-07 11:54:58 +0000
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
let string = formatter.string(from: Date())
print(string) // April 7, 2020 at 4:54:58 AM PDT
if let date = formatter.date(from: string) {
print(date) // 2020-04-07 11:54:58 +0000
}
因此,即使格式化程序成功地将Date
转换为String
,然后再转换,最后的print
语句使用与第一个print
语句相同的固定格式,因为我只是打印一个Date
对象。我并不担心最后的print
语句没有遵守我的DateFormatter
的配置。我没想到。当我打印Date
时,它总是以固定的预定义格式。我只担心DateFormatter
(第二个print
语句(生成的字符串的格式。
顺便说一句,还有关于"yyyy-MM-dd HH:mm:ss"
格式的次要问题。这代表什么时区?您的本地时区?你的服务器的时区?GMT/UTC/祖鲁?我们经常使用ISO8601/RFC3339日期字符串(如2020-04-07T11:54:58Z
(来消除这种歧义。你应该先处理好你最初的问题,但当你有了这个问题之后,你会想仔细看看为什么要以这种格式存储它,以及你想如何正确处理时区。但首先要做的事。