Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DateFormatter在英国地区和时区将字符串转换为日期时给了我不正确的结果_Date_Dateformatter - Fatal编程技术网

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
,则表明您看到了