如何将此字符串转换为具有这种格式的日期?

Posted

技术标签:

【中文标题】如何将此字符串转换为具有这种格式的日期?【英文标题】:How to convert this string in a date with this format? 【发布时间】:2019-07-29 18:06:48 【问题描述】:

我正在使用 API,当我要求约会时,这个 API 会得到我的 String,如下所示:

20190717-0300

我想以 UILabel 的格式显示该日期:"dd '\(preposition)' MMMM"

我的尝试是做一个字符串扩展:

extension String 
 var toDate: String? 
        let dateFormatter = DateFormatter()
        let preposition = NSLocalizedString("of", comment: "Preposition of dates formatted")
        dateFormatter.dateFormat = "dd '\(preposition)' MMMM"
        dateFormatter.locale = Locale.current

        if let date = dateFormatter.date(from: self) 
            let dateString = dateFormatter.string(from: date)
            return dateString
        

        return nil
    

然后使用它:

myLabel.text = thatString.toDate

但是.toDate 总是返回nil

注意:我在网站上找到的答案都是 ISO 格式字符串的情况。

预期结果:

7 月 17 日

【问题讨论】:

在将日期字符串从一种格式转换为另一种格式时,您需要两个日期格式化程序。 附带说明,您应该避免使用硬编码的“dd prep MMMM”格式。使用正确本地化的格式,以避免使用不自然的格式混淆用户。 dateFormatter.setLocalizedDateFormatFromTemplate("ddMMMM")。例如,这在美国给出“MMMM dd”,在西班牙给出“dd 'de' MMMM”,在德国给出“dd, MMMM”。 感谢您的 cmets,我将尝试在我的代码中实现它们。 How can I convert string date to NSDate?的可能重复 【参考方案1】:

基本上你需要一个输入日期格式和一个输出日期格式。

extension String 
    var toDate: String? 
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyyMMddZ"

        if let date = dateFormatter.date(from: self) 
            let preposition = NSLocalizedString("of", comment: "Preposition of dates formatted")
            dateFormatter.dateFormat = "dd '\(preposition)' MMMM"
            let dateString = dateFormatter.string(from: date)
            return dateString
        

        return nil
    

我完全同意 rmaddy 的评论使用setLocalizedDateFormatFromTemplate

日期字段符号的来源是unicode.org: Date Format Patterns

【讨论】:

【参考方案2】:

如果你愿意,可以把它变成扩展:

// function
func formatDate(_ from:String, preposition:String) -> String? 
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyyMMddZ"
    guard let date = dateFormatter.date(from: from) else 
        return nil
    
    dateFormatter.dateFormat = "dd '\(preposition)' MMMM"
    return dateFormatter.string(from: date)


// example usage
let str = "20190717-0300"
if let formatted = formatDate(str, preposition: "of") 
    print(formatted)

【讨论】:

1.这是如何扩展的? 2. 这对现有答案有何改进? 3. 不要发布仅代码的答案。解释问题中的问题以及此答案如何解决问题。 以前的答案很好。这只是删除格式化程序字符串中不必要的撇号,并使用guard-let而不是简单的if-let。另请注意不再使用“NSanything”,因为这些将长期弃用。只是帮助某人以防万一,而不是在这里得分。 NSLocalizeedString 仍用于本地化字符串。你需要\(preposition) 周围的'。它们是用日期格式引用字符串文字所必需的。 maddy介词是变量,不需要引号。 日期格式需要在结果两边加上引号。例如,dateFormat 将等于您的代码中的 "dd of MMMM",而它需要是 "dd 'of' MMMM"

以上是关于如何将此字符串转换为具有这种格式的日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期字符串转换为具有不同日期格式的时间戳?

如何将此特定的 varchar 转换为人类可读的日期格式?

如何将 python 日期时间转换为具有可读格式日期的字符串?

如何将格式稍有错误的 RFC822 字符串转换为日期?

在 SQL Server 中以日期时间格式转换日期时间字符串

在 pyspark SQL 中将字符串日期转换为日期格式