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 日期格式化程序错误地转换/创建日期/字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Swift DateFormatter 错误地转换字符串日期/时间

Swift - 将字符串转换为日期

使用 Swift Decode 协议格式化日期

无法在 Swift 中将日期格式转换为显示日期

Swift如何转换日期格式[重复]

Swift转换字符串到日期输出错误的日期