codememo

Swift - 타임스탬프가 어제, 오늘, 내일 또는 X일 전인지 확인합니다.

tipmemo 2023. 10. 30. 21:01
반응형

Swift - 타임스탬프가 어제, 오늘, 내일 또는 X일 전인지 확인합니다.

주어진 타임스탬프가 오늘 발생하는지, 아니면 +1 / -1일 발생하는지 결정하는 방법을 찾고 있습니다.본질적으로 이런 일을 하고 싶습니다(사이비코드)

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'

하지만 결정적으로, 그것은 스위프트에 있어야 하고 저는 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())

하지만 이런 식으로 비교하는 것은 쉽지 않습니다. 왜냐하면,.Day시간 및 타임스탬프에 따라 다릅니다.PHP에서 나는 하루의 시작(즉,)을 기준으로 새로운 날짜를 만들기 위해 mktime을 사용할 것입니다.mktime(0,0,0)), 하지만 스위프트에서 가장 쉬운 방법은 잘 모르겠습니다.

이것에 어떻게 접근해야 하는지에 대해 좋은 생각이 있는 사람?NSDate로 확장하거나 비슷한 것이 가장 좋을까요?

스위프트 3/4/5:

Calendar.current.isDateInToday(yourDate)
Calendar.current.isDateInYesterday(yourDate)
Calendar.current.isDateInTomorrow(yourDate)

추가:

Calendar.current.isDateInWeekend(yourDate)

일부 국가의 경우 주말은 토요일-일요일과 다를 수 있으며 달력에 따라 다릅니다.

사용할 수도 있습니다.autoupdatingCurrent대신에current사용자 업데이트를 추적하는 달력.동일한 방식으로 사용합니다.

Calendar.autoupdatingCurrent.isDateInToday(yourDate)

Calendar는 에 대한 유형 별칭입니다.NSCalendar.

Calendar세 가지 경우 모두에 대한 방법을 가지고 있습니다.

func isDateInYesterday(_ date: Date) -> Bool
func isDateInToday(_ date: Date) -> Bool
func isDateInTomorrow(_ date: Date) -> Bool

어제보다 빠른 날짜를 계산하려면 다음을 사용합니다.

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

통과하다[.day]로.components그리고 그것을 얻으라.day그 결과로 얻은 재산


이것은 또한 고려한 기능입니다.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" }
    }
}

다른 방법으로 사용할 수 있습니다.DateFormatterYesterday, Today, Tomorrow에서 무료로 현지화된 문자열을 얻을 수 있습니다.

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"
    }
}

업데이트:

macOS 10.15 / iOS 13은 특정 날짜에 대한 문자열을 반환(localized)하기 위해 도입되었습니다.

Swift 4 업데이트:

let calendar = Calendar.current
let date = Date()
        
calendar.isDateInYesterday(date)
calendar.isDateInToday(date)
calendar.isDateInTomorrow(date)

NSCalender에는 직접 사용할 수 있는 새로운 방법이 있습니다.

NSCalendar.currentCalendar().isDateInTomorrow(NSDate())//Replace NSDate() with your date
NSCalendar.currentCalendar().isDateInYesterday()
NSCalendar.currentCalendar().isDateInTomorrow()

도움이 되길 바랍니다.

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"

1)예에 따라 "Yesterday", "Today" 등의 레이블을 받기를 원하는 경우, iOS는 기본적으로 다음을 수행할 수 있습니다.

https://developer.apple.com/documentation/foundation/nsdateformatter/1415848-doesrelativedateformatting?language=objc

2)iOS가 이러한 레이블을 추가하지 않을 때 사용자 지정 레이블을 계산하려면 2를 사용할 수 있습니다.DateFormatter둘 다 있는 물건doesRelativeDateFormatting == true그리고.doesRelativeDateFormatting == false그리고 결과 날짜 문자열이 동일한지 또는 다른지 비교합니다.

언급URL : https://stackoverflow.com/questions/39345101/swift-check-if-a-timestamp-is-yesterday-today-tomorrow-or-x-days-ago

반응형