获取日期| Swift | iOS的格式

获取日期| Swift | iOS的格式,ios,swift,date,nsdateformatter,Ios,Swift,Date,Nsdateformatter,根据要求,我的API可能以“2018-01-01”或“01-01-2018”或“2018-01-01T00:00:00”格式返回日期 如何检查日期的格式 例如:我的API响应代码“2018-01-01”应返回“yyyy-MM-dd”等 我可以通过检查字符长度并相应地指定日期格式来实现这一点。但我觉得这不是正确的方法。在API中使用不明确的日期格式是有风险的。但是,如果您无法解决这个问题,您可以创建多个日期格式化程序,并为每种格式配置它们(通过相应地设置它们的日期格式),然后依次尝试使用每种格式转

根据要求,我的API可能以“2018-01-01”或“01-01-2018”或“2018-01-01T00:00:00”格式返回日期

如何检查日期的格式

例如:我的API响应代码“2018-01-01”应返回“yyyy-MM-dd”等


我可以通过检查字符长度并相应地指定日期格式来实现这一点。但我觉得这不是正确的方法。

在API中使用不明确的日期格式是有风险的。但是,如果您无法解决这个问题,您可以创建多个
日期格式化程序
,并为每种格式配置它们(通过相应地设置它们的
日期格式
),然后依次尝试使用每种格式转换字符串。一旦你成功了,你就知道你使用的是哪种格式(它是
dateFormat
)。

你只需要定义你的日期格式并尝试每种格式。其中一个会成功。只要确保所有日期字符串都来自同一时区(我想它们都是UTC),在使用固定格式日期时,不要忘记将日期格式化程序区域设置为“en_US_POSIX”:

let dateStrings = ["2018-01-01", "01-01-2018", "2018-01-01T00:00:00"]
let dateFormats = ["yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd", "MM-dd-yyyy"]
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
var dates: [Date] = []
for dateString in dateStrings {
    for dateFormat in dateFormats {
        formatter.dateFormat = dateFormat
        if let date = formatter.date(from: dateString) {
            dates.append(date)
            print("dateFormat:", dateFormat)
            print("date:", date)
            break
        }
    }
}

这会打印出来

日期格式:yyyy-MM-dd

日期:2018-01-01 00:00:00+0000

日期格式:年月日

日期:2018-01-01 00:00:00+0000

日期格式:yyyy-MM-dd'HH:MM:ss

日期:2018-01-01 00:00:00+0000


你约会的时区是什么?是UTC吗?您的第二个日期的格式是什么<代码>“MM dd yyyy”或
“dd MM yyyy”
?如果您绝对肯定日期将采用3种已知格式之一,那么Leo的答案中的方法将起作用,但这是一个非常糟糕的情况。为什么你正在使用的API会以3种不同的格式提供日期,而没有任何标记来区分哪个是哪个?根据要求,你的答案允许OP将输入字符串转换为日期,但他并不是这样问的。他询问如何返回能够解析日期的日期字符串。您需要稍微重构这段代码:“print(“format for'(dateString)”是“(dateFormat)”。"也许把它构造成一个函数,返回有效的日期格式。那真的很简单。他所需要的只是在附加日期后获得dateFormat。是的。把你的答案稍微重构成一个函数,将一个字符串日期作为输入,并返回作为输出的格式字符串,这很简单。正如你在yo中提到的不过,在你的评论中,我们无法分辨样本日期的哪一部分是月,哪一部分是日。@Duncac我认为OP不需要知道日期格式。他这样做只是为了能够解析我答案中已经显示的日期字符串。如果他真的需要,他可以通过查看我的代码自己计算出来。他做到了我的API响应代码“2018-01-01”应该返回我“yyyy-MM-dd”等等,这很明确。问题不是很清楚,正如你所说的,OP应该能够重构你的代码,从而不费吹灰之力就能得到结果。