Ios 如何比较两个日期组件

Ios 如何比较两个日期组件,ios,swift,datetime,calendar,Ios,Swift,Datetime,Calendar,我正在开发一个类似社交媒体的应用程序,用户在墙上发布保存到服务器的数据,然后返回到我想获取发布时间的应用程序,如facebook Instagram等(5小时前) 我从服务器得到的响应是 “2020-03-07T13:15:09” 所以首先我从约会时间中分出毫秒 func date(post: mdlSocialFeedbackView.mdlMemberWallPost) -> String{ let timeDateWithoutMilliseconds = post.Crea

我正在开发一个类似社交媒体的应用程序,用户在墙上发布保存到服务器的数据,然后返回到我想获取发布时间的应用程序,如facebook Instagram等(5小时前) 我从服务器得到的响应是

“2020-03-07T13:15:09”

所以首先我从约会时间中分出毫秒

func date(post: mdlSocialFeedbackView.mdlMemberWallPost) -> String{
    let timeDateWithoutMilliseconds = post.CreatedDate!.split(separator: ".")[0]
    let date = timeDateWithoutMilliseconds.split(separator: "T")[0]
    let time = timeDateWithoutMilliseconds.split(separator: "T")[1]
    let formatter = DateFormatter()
    let timeDateObject = formatter.timeFromServer(time: String(time))
    let dateObject = formatter.dateFromServer(date: String(date))
    let calender = Calendar.current
    let dateString = calender.dateOfPostOnWall(dateTime: dateObject!)
    if let date = dateString{
        return date
    }else{
        let timeString = calender.timeOfPostOnWall(dateTime: timeDateObject!)
        return timeString!
    }
}
我在UIViewController类中使用此函数从服务器获取时间并返回post的准确时间。 Calendar和DateFormatter类中的扩展,还可以帮助和指导我设置当前时区的格式

extension DateFormatter{

func dateFromServer(date: String) -> Date?{
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    //formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.timeZone = .current
    return formatter.date(from: date)
}

func timeFromServer(time: String) -> Date?{
    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm:ss"
    //formatter.timeZone = TimeZone(secondsFromGMT: 0)
    formatter.timeZone = .current
    return formatter.date(from: time)
}
}

}

现在的问题是,我什么时候发布当前时间返回的组件 墙上的反应是这样的

你的约会已经开始了。所以,使用一个

<代码>最终类ISO8601DATEFALTATER:基础.ISO8601DATEFALTATER { 重写init(){ super.init() formatOptions.remove(.withTimeZone) } 必需初始化?(编码器:NSCoder){ super.init(编码器:编码器) } } ISO8601DateFormatter().日期(从:“2020-03-07T13:15:09”) 您的日期在。所以,使用一个

<代码>最终类ISO8601DATEFALTATER:基础.ISO8601DATEFALTATER { 重写init(){ super.init() formatOptions.remove(.withTimeZone) } 必需初始化?(编码器:NSCoder){ super.init(编码器:编码器) } } ISO8601DateFormatter().日期(从:“2020-03-07T13:15:09”)
此错误的原因似乎是您的服务器时钟与设备的时间不同步。你应该找出哪个时钟的时间“正确”,然后调整另一个时钟。或者,重写服务器端代码,根据服务器的时钟以当前时间响应

无论如何,您也在代码中大量地重新发明轮子。错误也可能是由您自己编写的日期和时间处理代码引起的。您应该改为使用内置API,因为它们不太可能有bug

您收到的日期是ISO 8601格式的,因此您可以使用
ISO8601数据格式设置程序
对其进行解析。您的
dateFromServer
timeFromServer
方法非常冗余

func date(post: mdlSocialFeedbackView.mdlMemberWallPost) -> String{
    let dateString = post.CreatedDate!
    let formatter = ISO8601DateFormatter()
    formatter.formatOptions = [.withColonSeparatorInTime, .withTime, .withFullDate]
    let date = formatter.date(from: dateString)

    // to be continued
}
至少可以说,你找到两次约会之间差异的方法是值得怀疑的。如果我在12月31日发布一些东西,并在1月1日查看,我会看到“大约1年前”,我个人预计“大约1天前”,或者更少

您可以使用
dateComponents(quo:from:to:)
方法:

// Calendar extension
func estimatedTimeFromNow(date: Date)-> String {
    let diff = self.dateComponents([.year, .month, day, .hour, .minute, .second], from: date, to: Date())
    if let year = diff.year {
        return "about \(year) year(s) ago"
    } else if let month = diff.month {
        return "about \(month) month(s) ago"
    } else if let day = diff.day {
        return "about \(day) day(s) ago"
    } else if let hour = diff.hour {
        return "about \(hour) hour(s) ago"
    } else if let minute = diff.minute {
        return "about \(minute) minute(s) ago"
    } else if let second = diff.second {
        return "about \(second) second(s) ago"
    } else {
        return "just now"
    }
}
日期(post:)


这个错误的原因似乎是您的服务器时钟与设备的时间不同步。你应该找出哪个时钟的时间“正确”,然后调整另一个时钟。或者,重写服务器端代码,根据服务器的时钟以当前时间响应

无论如何,您也在代码中大量地重新发明轮子。错误也可能是由您自己编写的日期和时间处理代码引起的。您应该改为使用内置API,因为它们不太可能有bug

您收到的日期是ISO 8601格式的,因此您可以使用
ISO8601数据格式设置程序
对其进行解析。您的
dateFromServer
timeFromServer
方法非常冗余

func date(post: mdlSocialFeedbackView.mdlMemberWallPost) -> String{
    let dateString = post.CreatedDate!
    let formatter = ISO8601DateFormatter()
    formatter.formatOptions = [.withColonSeparatorInTime, .withTime, .withFullDate]
    let date = formatter.date(from: dateString)

    // to be continued
}
至少可以说,你找到两次约会之间差异的方法是值得怀疑的。如果我在12月31日发布一些东西,并在1月1日查看,我会看到“大约1年前”,我个人预计“大约1天前”,或者更少

您可以使用
dateComponents(quo:from:to:)
方法:

// Calendar extension
func estimatedTimeFromNow(date: Date)-> String {
    let diff = self.dateComponents([.year, .month, day, .hour, .minute, .second], from: date, to: Date())
    if let year = diff.year {
        return "about \(year) year(s) ago"
    } else if let month = diff.month {
        return "about \(month) month(s) ago"
    } else if let day = diff.day {
        return "about \(day) day(s) ago"
    } else if let hour = diff.hour {
        return "about \(hour) hour(s) ago"
    } else if let minute = diff.minute {
        return "about \(minute) minute(s) ago"
    } else if let second = diff.second {
        return "about \(second) second(s) ago"
    } else {
        return "just now"
    }
}
日期(post:)


您的服务器时钟是否与设备时钟不同步?您的服务器时钟是否与设备时钟不同步?