Swift 日期格式化程序错误地转换/创建日期/字符串 [重复]
Posted
技术标签:
【中文标题】Swift 日期格式化程序错误地转换/创建日期/字符串 [重复]【英文标题】:Swift date formatter wrongfully converting/creating dates/strings [duplicate] 【发布时间】:2021-10-31 17:06:59 【问题描述】:女士们,先生们,您好!
长话短说,我有一个辅助结构,其中有一些辅助函数用于创建日期格式化程序、日期对象和日期的字符串表示。 我已经调试并缩小到这个范围:
func getFormattedString(from stringDate: String,
with timeZoneID: String? = nil,
appFormat appDateFormat: DateFormats = .api,
apiFormat apiDateFormat: DateFormats = .api) -> String?
//this must use the default utc timezone so pass in the nil value here
let apiDateFormatter = dateFormatter(with: apiDateFormat, timeZoneID: nil)
if let utcDate = apiDateFormatter.date(from: stringDate)
let appDateFormatter = dateFormatter(with: appDateFormat, timeZoneID: timeZoneID)
return appDateFormatter.string(from: utcDate)
return nil
对于 dateFormatter(with:) 使用这个函数:
enum DateFormats: String
case api = "YYYY-MM-dd HH:mm:ss"
// more cases here
let utcTimeZone = TimeZone(abbreviation: "UTC")
func dateFormatter(with dateFormat: DateFormats = .api, timeZoneID: String?) -> DateFormatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = dateFormat.rawValue
if let timeZoneID = timeZoneID
if let timezoneIdentifier = TimeZone(identifier: timeZoneID)
dateFormatter.timeZone = timezoneIdentifier
else if let abbreviatedTimezone = TimeZone(abbreviation: timeZoneID)
dateFormatter.timeZone = abbreviatedTimezone
else
dateFormatter.timeZone = utcTimeZone
else
dateFormatter.timeZone = utcTimeZone
return dateFormatter
基本上我从服务器得到一个字符串,它是 UTC 格式的,所以我从 UTC 时区的那个字符串创建我的 Date 对象。然后我正在创建另一个日期格式化程序,这次使用来自服务器的时区。 到目前为止一切都很好,但我最近遇到了一个奇怪的案例。
假设我们有来自“服务器”的以下字符串: 让开始=“2021-12-25 00:00:00” let end = "2021-12-26 23:59:59"
当我们调用 getFormattedString(from: start) 时,它会为我们提供一个表示相同日期(年、月和日)的字符串,但如果我们在任何一年的 12 月 26 日调用它,则创建的字符串由日期格式化程序将自动递增从 2021 年到 2022 年的年份...我看到这只发生在以下日期:从 12 月 26 日到 31 日,包括 26 日和 31 日。但对于任何其他月份,这不会发生。
我真的想知道我是否从一开始就做错了什么,或者这确实是一个非常极端的错误?
我必须根据事件的时区显示日期和字符串日期,再加上我们从服务器获得基于 UTC 时区的日期,并且有一个日历必须显示从 UTC 到事件正确时区的所有内容,同时还确保整个日历可能会根据用户的当前时区而改变。 我知道,处理日期并不愉快,但我 100% 肯定代码工作正常。我的意思是这是一个已经投入生产多年的功能,没有人提出过这个问题(谢天谢地,这是一个每个人都花时间不工作的时期,不像我哈哈)。老实说,我什至不知道我是如何遇到这种超级边缘情况的......
任何帮助或建议都意义重大。提前谢谢大家:)
【问题讨论】:
YYYY 表示一年中的第几周,您需要 yyyy 作为 api 日期格式。 大人,非常感谢。它现在就像一个魅力。似乎有人将格式字符串从“yyyy ...”更改为“YYYY ...”。还有更多的字符串格式,它们都使用小写的“y”。只有这个 api 案例使用了大写字母(只是最重要的一个)哈哈。我花了将近 3 天的时间来调试这个 lmao。如果我能报答你,好先生,不要犹豫,因为我也会来帮助你的。祝您有美好的一天,陛下! /弓 【参考方案1】:问题是大写的“YYYY”,因为应该有小写的,如“yyyy”。 solution。 非常感谢 m'lord Joakim。
【讨论】:
以上是关于Swift 日期格式化程序错误地转换/创建日期/字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章