在 iphone 中找不到正确的日期格式化程序 (DateFormatter)

Posted

技术标签:

【中文标题】在 iphone 中找不到正确的日期格式化程序 (DateFormatter)【英文标题】:Can't find the right date formatter (DateFormatter) in iphone 【发布时间】:2017-07-29 12:42:37 【问题描述】:

我正在从服务器获取日期字符串,例如“2017-08-05T00:30:00.000+02:00”。以下是我的日期格式化程序代码。

 let dateFormatter: DateFormatter = DateFormatter()
 let serverDateString = "2017-08-05T00:30:00.000+02:00"
 dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZZ"
 dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX")
 let currentDate: Date = dateFormatter.date(from: serverDateString)!

但它返回 2017-08-04 22:30:00 +0000。这是错误的。有什么建议吗?

【问题讨论】:

你希望你的 dateformatter 采用哪种格式 我想让它回复我这个 2017-08-05 00:30:00 +0000 的谎言。它确实以这种格式返回我,但日期和时间不正确。现在它正在返回 2017-08-04 22:30:00 +0000。相反,它应该返回 2017-08-05 00:30:00 +0000。 使用这个nsdateformatter.com可以帮助你我认为 试试这个链接***.com/questions/41169923/… 2017-08-05T00:30:00.000+02:002017-08-04 22:30:00 +0000 是在不同时区表示的同一时刻。就像伦敦的早上 7 点 (GMT+0) 是雅典的早上 9 点 (GMT+2)。你为什么期待2017-08-05 00:30:00 +0000?您想从服务器的响应中删除时区信息吗? 【参考方案1】:

在 Swift 3 中 您可以将服务器时间字符串更改为 UTC 时间 Date 为:

let dateFormatter: DateFormatter = DateFormatter()
var serverDateString = "2017-08-05T00:30:00.000+02:00"
let index = serverDateString.index(serverDateString.startIndex, offsetBy: 19)
serverDateString = serverDateString.substring(to: index)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = TimeZone.init(identifier: "UTC")
let currentDate: Date = dateFormatter.date(from: serverDateString)!

【讨论】:

这就像一个魅力。显然我不得不忽略服务器的时间戳,你这样做了。我昨天整天都在拉头发。非常感谢。【参考方案2】:

您的解析日期代码是正确的:2017-08-05T00:30:00.000+02:002017-08-04 22:30:00 +0000 代表相同的时间,只是在不同的时区。您唯一的问题是 Date 实际上并没有存储时区

【讨论】:

那么我怎样才能得到想要的结果呢? 您想更改服务器端和应用程序端,例如。服务器应该返回 UTC 然后你在你的 dateFormatter 中设置时区到 UTC【参考方案3】:
yyyy-MM-dd'T'hh:mm:ss.SSSZZZZZZ

这是您输入字符串的正确日期格式。这里是the Apple Document 以获得更多描述。

这是我的代码:

var strInputDateString: String = "2017-08-05T00:30:00.000+02:00"
var dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd'T'hh:mm:ss.SSSZZZZZZ"
    //Set new dateFormate
var date1: Date? = dateFormat.date(from: strInputDateString)
dateFormat.dateFormat = "dd-MM-YYYY hh:mm:ss"
    // Your Desire
var strOutputDateString: String = dateFormat.string(from: date1!)
print("\(strInputDateString)")
print("\(strOutputDateString)")

输出:

Main input String:2017-08-05T00:30:00.000+02:00
Converted String:  05-08-2017 04:00:00

目前,我尝试使用我的自定义转换您的日期格式。它给了我完美的输出。

【讨论】:

这是我正在使用的,但它返回错误的日期和时间。日期应该是 2017-08-05 它返回的是 2017-08-04。那是一天前的事了。这就是问题所在。 @uzairshahzad 我发布了我用来演示项目的代码。它工作正常。 这里返回的日期没问题。但是时间不对。它应该是 00:30:00 但它返回 02:30:00 因为它会在 mytime zone 上转换。 如何防止它转换为时区?我想在从服务器获取时显示。【参考方案4】:

实际上,您的代码很好。 我复制了你的数据并在操场上运行它。 你想要什么样的格式?

【讨论】:

尝试在设备上运行它。在设备上,这是我得到 2017-08-04 22:30:00 +0000 的结果。这是错误的。日期应为 2017-08-05,时间应为 12:30:00 +0000 我之前遇到过和你一样的问题,看看这个my old question 我检查了你的答案,但我已经这样做了,dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX") 其实08-05 00:30:00 +02:00等于-08-04 22:30:00 +00:00 我不熟悉日期 API,但如果您只是想获取日期,这可能对 Date(timeInterval: -7200, since: currentDate) 有所帮助。服务器返回了一个 GMT +02:00 的日期,但您需要一个 GMT +00:00 的日期,所以我只是将日期提前了 -7200 秒。【参考方案5】:

试试这个

let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXX"
dateFormatter.locale = Foundation.Locale(identifier: "en_US_POSIX")
let currentDate: Date = dateFormatter.date(from: serverDateString)!

希望对你有帮助

【讨论】:

它不起作用。在这种情况下,DateFormatter 会返回 nil。 还是一样。 DateFormatter 返回 nil。【参考方案6】:

您缺少的步骤是再次使用 DateFormatter 将日期格式化为字符串。当您在日期上使用打印时,它将始终显示 GMT。出于说明目的,我将 TimeZone 设置为 Berlin 以匹配 +2:00 的原始偏移量。

let dateFormatter: DateFormatter = DateFormatter()
let serverDateString = "2017-08-05T00:30:00.000+02:00"
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZZ"

// Hard set to Berlin
dateFormatter.timeZone = TimeZone(identifier: "Europe/Berlin")
let currentDate: Date = dateFormatter.date(from: serverDateString)!

// Your missing step
dateFormatter.string(from: currentDate)

记住 DateFormatter 是关于:

从字符串 解析 - df.date(from: String) 格式化日期 - df.string(from: Date)

【讨论】:

我不想将其转换为任何时区。它必须在从服务器接收时使用。 但是你的答案是正确的,你的种子时间是+02:00,你的输出是+00:00

以上是关于在 iphone 中找不到正确的日期格式化程序 (DateFormatter)的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 应用程序中找不到类型现金流的属性日期

.dylib 在 Debug 中链接,在 XCode 中找不到 iPhone 的 Release

在iphone的“文件”目录中找不到保存的pdf文件

在最新的 Xcode 版本 11.2.1 中找不到 iPhone 7、iPhone 7 Plus 和更低模式的设备 [重复]

在程序集“ProjectName.Web”中找不到 DbContext。确保您使用的是正确的程序集,并且该类型既不是抽象的也不是泛型的

在为arm64 Android手机构建应用程序包时,在ApplicationInfo.nativeLibraryDir中找不到本机库