Swift - 检查时间戳是昨天,今天,明天还是X天前

Ben*_*Ben 48 nsdate nscalendar ios swift

我正在尝试弄清楚如何确定给定时间戳今天是否发生,或+1/-1天.基本上,我想做这样的事情(Pseudocode)

IF days_from_today(timestamp) == -1 RETURN 'Yesterday'
ELSE IF days_from_today(timestamp) == 0 RETURN 'Today'
ELSE IF days_from_today(timestamp) == 1 RETURN 'Tomorrow'
ELSE IF days_from_today(timestamp) < 1 RETURN days_from_today(timestamp) + ' days ago'
ELSE RETURN 'In ' + days_from_today(timestamp) + ' ago'
Run Code Online (Sandbox Code Playgroud)

至关重要的是,它需要在Swift中,我正在努力使用NSDate/NSCalendar对象.我开始研究这样的时差:

let calendar = NSCalendar.currentCalendar()
let date = NSDate(timeIntervalSince1970: Double(timestamp))
let timeDifference = calendar.components([.Second,.Minute,.Day,.Hour],
    fromDate: date, toDate: NSDate(), options: NSCalendarOptions())
Run Code Online (Sandbox Code Playgroud)

然而,以这种方式进行比较并不容易,因为.Day根据一天中的时间和时间戳而不同.在PHP中,我只是使用mktime来创建一个基于一天开始的新日期(即mktime(0,0,0)),但我不确定在Swift中最简单的方法.

有没有人对如何处理这个问题有个好主意?也许NSDate或类似的东西的扩展最好?

Kli*_*akM 101

迅捷3/4:

Calendar.current.isDateInToday(yourDate)
Calendar.current.isDateInYesterday(yourDate)
Calendar.current.isDateInTomorrow(yourDate)
Run Code Online (Sandbox Code Playgroud)

另外:

Calendar.current.isDateInWeekend(yourDate)
Run Code Online (Sandbox Code Playgroud)

请注意,对于某些国家/地区周末可能与周六至周日不同,这取决于日历.

您还可以使用autoupdatingCurrent代替current日历来跟踪用户更新.你以同样的方式使用它:

Calendar.autoupdatingCurrent.isDateInToday(yourDate)
Run Code Online (Sandbox Code Playgroud)

Calendar是一个类型的别名NSCalendar.


vad*_*ian 91

Calendar 有三种方法的方法

func isDateInYesterday(_ date: Date) -> Bool
func isDateInToday(_ date: Date) -> Bool
func isDateInTomorrow(_ date: Date) -> Bool
Run Code Online (Sandbox Code Playgroud)

要计算比昨天更早的天数使用

func dateComponents(_ components: Set<Calendar.Component>, 
                      from start: Date, 
                          to end: Date) -> DateComponents
Run Code Online (Sandbox Code Playgroud)

传递[.day]给结果componentsday从结果中获取属性.


这是一个is in通过剥离时间部分(Swift 3+)来考虑早期和晚期日期的函数.

func dayDifference(from interval : TimeInterval) -> String
{
    let calendar = Calendar.current
    let date = Date(timeIntervalSince1970: interval)
    if calendar.isDateInYesterday(date) { return "Yesterday" }
    else if calendar.isDateInToday(date) { return "Today" }
    else if calendar.isDateInTomorrow(date) { return "Tomorrow" }
    else {
        let startOfNow = calendar.startOfDay(for: Date())
        let startOfTimeStamp = calendar.startOfDay(for: date)
        let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)
        let day = components.day!
        if day < 1 { return "\(-day) days ago" }
        else { return "In \(day) days" }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用DateFormatter昨天,今天明天,以免费获得本地化字符串

func dayDifference(from interval : TimeInterval) -> String
{
    let calendar = Calendar.current
    let date = Date(timeIntervalSince1970: interval)
    let startOfNow = calendar.startOfDay(for: Date())
    let startOfTimeStamp = calendar.startOfDay(for: date)
    let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)
    let day = components.day!
    if abs(day) < 2 {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.timeStyle = .none
        formatter.doesRelativeDateFormatting = true
        return formatter.string(from: date)
    } else if day > 1 {
        return "In \(day) days"
    } else {
        return "\(-day) days ago"
    }
}
Run Code Online (Sandbox Code Playgroud)


Edw*_*ard 17

Swift 4更新:

    let calendar = Calendar.current
    let date = Date()

    calendar.isDateInYesterday(date)
    calendar.isDateInToday(date)
    calendar.isDateInTomorrow(date)
Run Code Online (Sandbox Code Playgroud)

  • 获取当前日期(`Date()`)并检查它是昨天还是明天有什么意义?看起来您想更改复制代码中的任何内容...... (2认同)

nis*_*ngh 6

NSCalender有新的方法可以直接使用.

NSCalendar.currentCalendar().isDateInTomorrow(NSDate())//Replace NSDate() with your date
NSCalendar.currentCalendar().isDateInYesterday()
NSCalendar.currentCalendar().isDateInTomorrow()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


rus*_*ord 6

Swift 5iOS 13 上使用 RelativeDateTimeFormatter,

let formatter = RelativeDateTimeFormatter()
formatter.dateTimeStyle = .named 

formatter.localizedString(from: DateComponents(day: -1)) // "yesterday"
formatter.localizedString(from: DateComponents(day: 1)) // "Tomorrow"
formatter.localizedString(from: DateComponents(hour: 2)) // "in 2 hours"
formatter.localizedString(from: DateComponents(minute: 45)) // "in 45 minutes"
Run Code Online (Sandbox Code Playgroud)