DateFormatter在英国地区和时区将字符串转换为日期时给了我不正确的结果
我想要DateFormatter在英国地区和时区将字符串转换为日期时给了我不正确的结果,date,dateformatter,Date,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" date
“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
对象只表示一个时间点。“我应该在12小时或24小时内显示它”不是Date
对象知道的东西。这是由日期格式化程序生成(或使用)的字符串的一项功能
因此,有几点想法:
- 日期格式化程序的
dateFormat
(及其locale
)指示调用string(from:)
时字符串的外观。(当您调用Date(from:)
时,它还将指示如何解释字符串并创建Date
对象,但这与此处无关。)
因此,如果要使用24小时时钟查找日期的字符串表示形式,请查看由日期格式化程序的string(from:)
方法生成的字符串。这是示例中的dateToString
字符串
- 但是,如果随后从格式化程序的
Date(from:)
方法生成Date
对象,则生成的Date
将不会捕获是否使用12对24小时时钟。如果您打印
此日期
对象,它将不会反映您的12/24小时时钟偏好
总之,在查看由日期格式化程序生成(或传递到的字符串对象时,只需考虑am/pm与24小时时钟的关系。打印Date
对象时,不要担心输出的格式,因为这仅用于调试目的,不会捕获此am/pm vs 24小时时钟维度
你说:
最终报表给了我“2020-04-09 4:23:27 am+0000”格式
如果您看到+0000
,则表明您正在打印日期
对象本身。DateFormatter
的dateFormat
和locale
仅控制由string(from:)
生成的字符串的格式(以及字符串的解析方式)
因此,打印由DateFormatter
生成的字符串,而不是Date
对象。日期
对象的打印将始终采用此预定义格式。在应用程序中,如果需要给定格式的输出,请使用由DateFormatter
生成的字符串,而不是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
}
因此,即使格式化程序成功地将日期
转换为字符串
,然后再转换回来,最终的打印
语句使用与第一个打印
语句相同的固定格式,因为我只是打印一个日期
对象。我并不担心最后的打印
语句不符合我的日期格式化程序
的配置。我没想到会这样。当我打印日期时,它总是以固定的预定义格式。我只担心DateFormatter
(第二个print
语句)生成的字符串的格式
另外,还有一些关于您的“yyyy-MM-dd HH:MM:ss”
格式的次要问题。这代表什么时区?你当地的时区?你的服务器的时区?GMT/UTC/Zulu?我们经常使用ISO8601/RFC3339日期字符串(如2020-04-07T11:54:58Z
)来消除这种歧义。你应该先把注意力放在你原来的问题上,但是当你有了这个问题之后,你会想仔细看看为什么要用这种格式存储它,以及你想如何正确处理时区。但是首先要做的事情。一个Date
对象只代表一个时间点。“我应该在12小时或24小时内显示它”不是Date
对象知道的东西。这是由日期格式化程序生成(或使用)的字符串的一项功能
因此,有几点想法:
- 日期格式化程序的
dateFormat
(及其locale
)指示调用string(from:)
时字符串的外观。(当您调用Date(from:)
时,它还将指示如何解释字符串并创建Date
对象,但这与此处无关。)
因此,如果要使用24小时时钟查找日期的字符串表示形式,请查看由日期格式化程序的string(from:)
方法生成的字符串。这是示例中的dateToString
字符串
- 但是,如果随后从格式化程序的
Date(from:)
方法生成Date
对象,则生成的Date
将不会捕获是否使用12对24小时时钟。如果您打印
此日期
对象,它将不会反映您的12/24小时时钟偏好
总之,在查看由日期格式化程序生成(或传递到的字符串对象时,只需考虑am/pm与24小时时钟的关系。打印Date
对象时,不要担心输出的格式,因为这仅用于调试目的,不会捕获此am/pm vs 24小时时钟维度
你说:
最终报表给了我“2020-04-09 4:23:27 am+0000”格式
如果您看到的是+0000
,则表明您看到了