Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift iOS的相关数据格式除了“0”之外,还有不同的值;“今天”;及;昨天;?_Ios_Date_Swift_Nsdateformatter_Relative Date - Fatal编程技术网

Swift iOS的相关数据格式除了“0”之外,还有不同的值;“今天”;及;昨天;?

Swift iOS的相关数据格式除了“0”之外,还有不同的值;“今天”;及;昨天;?,ios,date,swift,nsdateformatter,relative-date,Ios,Date,Swift,Nsdateformatter,Relative Date,我有一些日期,我试图用一个相对的日期来表示,比如“今天,昨天,1周前,1个月前”等等 这是我正在使用的Swift代码: let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = .MediumStyle dateFormatter.doesRelativeDateFormatting = true let uploadDate = dateFormatter.stringFromDate(date) 仅表示“今天”和“昨天”

我有一些日期,我试图用一个相对的日期来表示,比如“今天,昨天,1周前,1个月前”等等

这是我正在使用的Swift代码:

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.doesRelativeDateFormatting = true
let uploadDate = dateFormatter.stringFromDate(date)
仅表示“今天”和“昨天”,其余日期如下所示: 2014年11月24日 2014年11月17日 等等


是否有其他方法可以使用相对日期而不是实际日期来表示所有日期?

您应该看看Mattt Thompsons关于NSDateComponents Formter的博客文章


示例(Mattt Thompson)

编辑/更新:Xcode 8.3.2•Swift 3.1

如果您使用扩展名和日历方法来帮助您进行日历计算,这将非常容易:

extension Date {
    var yearsFromNow: Int {
        return Calendar.current.dateComponents([.year], from: self, to: Date()).year!
    }
    var monthsFromNow: Int {
        return Calendar.current.dateComponents([.month], from: self, to: Date()).month!
    }
    var weeksFromNow: Int {
        return Calendar.current.dateComponents([.weekOfYear], from: self, to: Date()).weekOfYear!
    }
    var daysFromNow: Int {
        return Calendar.current.dateComponents([.day], from: self, to: Date()).day!
    }
    var isInYesterday: Bool {
        return Calendar.current.isDateInYesterday(self)
    }
    var hoursFromNow: Int {
        return Calendar.current.dateComponents([.hour], from: self, to: Date()).hour!
    }
    var minutesFromNow: Int {
        return Calendar.current.dateComponents([.minute], from: self, to: Date()).minute!
    }
    var secondsFromNow: Int {
        return Calendar.current.dateComponents([.second], from: self, to: Date()).second!
    }
    var relativeTime: String {
        if yearsFromNow > 0 { return "\(yearsFromNow) year" + (yearsFromNow > 1 ? "s" : "") + " ago" }
        if monthsFromNow > 0 { return "\(monthsFromNow) month" + (monthsFromNow > 1 ? "s" : "") + " ago" }
        if weeksFromNow > 0 { return "\(weeksFromNow) week" + (weeksFromNow > 1 ? "s" : "") + " ago" }
        if isInYesterday { return "Yesterday" }
        if daysFromNow > 0 { return "\(daysFromNow) day" + (daysFromNow > 1 ? "s" : "") + " ago" }
        if hoursFromNow > 0 { return "\(hoursFromNow) hour" + (hoursFromNow > 1 ? "s" : "") + " ago" }
        if minutesFromNow > 0 { return "\(minutesFromNow) minute" + (minutesFromNow > 1 ? "s" : "") + " ago" }
        if secondsFromNow > 0 { return secondsFromNow < 15 ? "Just now"
            : "\(secondsFromNow) second" + (secondsFromNow > 1 ? "s" : "") + " ago" }
        return ""
    }
}
var相对时间:字符串{
//不要忘记这些常数的间距。
让futurePrefix=“”/“in”在这里是一个可行的选择。。。
让pastSuffix=“ago”/“ago”在这里成为一个可行的选择。。。
现在让我们=NSDate()
对于中的(方法、单位名称)[
(现在,年),
(现在为“月”),
(now.weeks,“week”),
(now.days,“day”),
(now.hours,“hour”),
(now.minutes,“分钟”),
(现在,秒,“秒”)
] {
让数量=方法(自身)
设absQty=abs(方法(自身))
如果数量>0{
退货(数量<0?未来前缀:)+
字符串(absQty)+“”+
单位名称+
(absQty==1?“:“s”)+
(数量>0?后缀:“”)
}
}
返回“”
}
Leo Dabus的relativeTime实现的另一种实现,它既包含未来也包含过去,而且更加简洁。(Swift2.3)

iOS 13+现在有

例如:


你是说“两天前”,“一周前”?此github repo有一个很好的相对日期函数,您可以根据项目进行编辑。希望有帮助@MikeTaverne是的,这正是我想要做的。
NSDateFormatter
是非常彻底的国际化/本地化。(例如,你只能得到英语中的“今天/昨天/明天”,但其他语言中有表示其他相关日期的单词-おととい 及明後日 例如,在日语中,苹果的类使用了它们。(
nsdatecomponentsformter
对于处理时间/日期间隔也是非常本地化的。)如果你这样做,你将把处理各种国际日期/时间格式问题的负担从苹果转移到你自己身上。非常好的解决方案,直到支持
extension Date {
    var yearsFromNow: Int {
        return Calendar.current.dateComponents([.year], from: self, to: Date()).year!
    }
    var monthsFromNow: Int {
        return Calendar.current.dateComponents([.month], from: self, to: Date()).month!
    }
    var weeksFromNow: Int {
        return Calendar.current.dateComponents([.weekOfYear], from: self, to: Date()).weekOfYear!
    }
    var daysFromNow: Int {
        return Calendar.current.dateComponents([.day], from: self, to: Date()).day!
    }
    var isInYesterday: Bool {
        return Calendar.current.isDateInYesterday(self)
    }
    var hoursFromNow: Int {
        return Calendar.current.dateComponents([.hour], from: self, to: Date()).hour!
    }
    var minutesFromNow: Int {
        return Calendar.current.dateComponents([.minute], from: self, to: Date()).minute!
    }
    var secondsFromNow: Int {
        return Calendar.current.dateComponents([.second], from: self, to: Date()).second!
    }
    var relativeTime: String {
        if yearsFromNow > 0 { return "\(yearsFromNow) year" + (yearsFromNow > 1 ? "s" : "") + " ago" }
        if monthsFromNow > 0 { return "\(monthsFromNow) month" + (monthsFromNow > 1 ? "s" : "") + " ago" }
        if weeksFromNow > 0 { return "\(weeksFromNow) week" + (weeksFromNow > 1 ? "s" : "") + " ago" }
        if isInYesterday { return "Yesterday" }
        if daysFromNow > 0 { return "\(daysFromNow) day" + (daysFromNow > 1 ? "s" : "") + " ago" }
        if hoursFromNow > 0 { return "\(hoursFromNow) hour" + (hoursFromNow > 1 ? "s" : "") + " ago" }
        if minutesFromNow > 0 { return "\(minutesFromNow) minute" + (minutesFromNow > 1 ? "s" : "") + " ago" }
        if secondsFromNow > 0 { return secondsFromNow < 15 ? "Just now"
            : "\(secondsFromNow) second" + (secondsFromNow > 1 ? "s" : "") + " ago" }
        return ""
    }
}
let calendar =  Calendar.current

let date1 = DateComponents(calendar: calendar, year: 2016, month:  3, day: 14, hour: 22, minute: 39).date!
let date2 = DateComponents(calendar: calendar, year: 2019, month:  4, day: 18, hour: 22, minute: 39).date!
let date3 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  2, hour: 12, minute: 38).date!
let date4 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  14, hour: 3, minute: 0).date!
let date5 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  17, hour: 23, minute: 45).date!
let date6 = DateComponents(calendar: calendar, year: 2019, month: 6, day:  18, hour: 19, minute:  17).date!
let timeOffset1 = date1.relativeTime // "3 years ago"
let timeOffset2 = date2.relativeTime // "1 month ago"
let timeOffset3 = date3.relativeTime // "2 weeks ago"
let timeOffset4 = date4.relativeTime // "4 days ago"
let timeOffset5 = date5.relativeTime // "Yesterday"
let timeOffset6 = date6.relativeTime // "Just now"
var relativeTime: String {
    // don't forget spacing on these constants.
    let futurePrefix = "" // " in" is a viable choice here...
    let pastSuffix = " ago" // " ago" is a viable choice here...
    let now = NSDate()
    for (method, unitName) in [
        (now.years, "year"),
        (now.months, "month"),
        (now.weeks, "week"),
        (now.days, "day"),
        (now.hours, "hour"),
        (now.minutes, "minute"),
        (now.seconds, "second")
    ] {
        let qty = method(self)
        let absQty = abs(method(self))
        if absQty > 0 {
            return (qty < 0 ? futurePrefix : "") +
                String(absQty) + " " +
                unitName +
                (absQty == 1 ? "": "s") +
                (qty > 0 ? pastSuffix : "")
        }
    }
    return ""
}
let formatter = RelativeDateTimeFormatter()
formatter.localizedString(from: DateComponents(day: 1, hour: 1)) // "in 1 day"
formatter.localizedString(from: DateComponents(day: -1)) // "1 day ago"
formatter.localizedString(for: date, relativeTo: Date())