当我在英国地区将字符串转换为日期时,DateFormatter给了我不正确的结果,时区是马斯喀特



我想要"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小时时钟。如果您printDate对象,它将不会反映您的12/24小时时钟偏好。

最重要的是,在查看由DateFormatter生成(或传递给(的String对象时,只关注上午/下午与24小时时钟。打印Date对象时,不要担心输出的格式,因为这仅用于调试目的,不会捕获上午/下午与24小时的时钟维度。

你说:

最后一句话是给我"2020-04-09 4:23:27 am+0000"的格式。

如果您看到+0000,则表明您正在打印Date对象本身。DateFormatterdateFormatlocale仅控制由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(来消除这种歧义。你应该先处理好你最初的问题,但当你有了这个问题之后,你会想仔细看看为什么要以这种格式存储它,以及你想如何正确处理时区。但首先要做的事。

最新更新