extension NSDate {
func formattedRelativeString() -> String
{
let dateFormatter = DateFormatter()
if isInToday || isInYesterday {
/// today and yesterday
/// Today, 3:57 PM
dateFormatter.doesRelativeDateFormatting = true
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .short
} else if isLessThanAweekAgo {
/// less than a week ago
/// Friday, 4:03 PM
dateFormatter.dateFormat = "EEEE, h:mm a"
} else if isInThisYear {
// more than a week ago
// Fri, 4 Aug, 3:55
dateFormatter.dateFormat = "E, d MMM, h:mm a"
} else {
// more than a year ago
// Aug 10, 2016, 3:56
dateFormatter.dateFormat = "MMM d, yyyy, h:mm a"
}
return dateFormatter.string(from: self)
}
}
字符串 你可以在playground上用这些样本日期来测试它:
let now = Date()
let yesterday = Date(timeInterval: -24*60*60, since: Date())
let weekAgo = Date(timeInterval: -7*24*60*60, since: Date())
let yearAgo = Date(timeInterval: -366*24*60*60, since: Date())
let now = Date().formattedRelativeString()
// Now
let today = Date(timeInterval: -60*60, since: Date()).formattedRelativeString()
// Today, 9:06 AM
let yesterday = Date(timeInterval: -24*60*60, since: Date()).formattedRelativeString()
// Yesterday, 10:06 AM
let weekAgo = Date(timeInterval: -7*24*60*60, since: Date()).formattedRelativeString()
// Fri, 28 Jul, 10:06 AM
let yearAgo = Date(timeInterval: -366*24*60*60, since: Date()).formattedRelativeString()
// 3 Aug, 2022, 10:06 AM
8条答案
按热度按时间du7egjpx1#
以下是如何在Swift 4和5中原生完成这一切:
字符串
avkwfej42#
我也需要这个,所以我写了下面的NSDate扩展:
字符串
这需要Matthew约克出色的DateTools来工作。
flmtquvp3#
Swift 3版本@avf响应:
字符串
izkcnapc4#
Swift 4更新:
字符串
你可以在playground上用这些样本日期来测试它:
型
xqkwcwgp5#
字符串
试试这个代码,根据你的要求修改它。
rn0zuynd6#
目标C格式化日期和时间。
使用Matthew约克优秀的DateTools方法。
NSDate扩展名:
字符串
b4wnujal7#
我尝试了所有的方法,但不幸的是,没有一个对我有效。不管怎样,我最终找到了一个解决方案。
Swift版本
字符串
您可以根据需要更改每个日期的格式。要创建自己的自定义日期格式,请参阅此article。
输出
型
hjzp0vay8#
使用NSDateFormatter并将其
doesRelativeDateFormatting
属性设置为YES。