2016-09-06 2 views
13

오늘 주어진 타임 스탬프가 발생하는지 또는 +1/-1 일인지를 결정하는 방법을 찾으려합니다. 기본적으로, 나는 결정적으로, 비록 그것이 스위프트에 있어야하고 내가있는 NSDate/NSCalendar 객체와 사투를 벌인거야Swift - 타임 스탬프가 어제, 오늘, 내일 또는 X 일 전인 지 확인하십시오.

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' 

이 (의사 코드) 같은 것을 할 싶습니다. 나는이 같은 시간 차이를 운동을 시작하십시오 .Day 하루와 타임 스탬프의 시간에 따라 다르기 때문에

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

그러나이 방법으로 비교, 쉬운 일이 아니다. PHP에서 mktime을 사용하여 오늘 날짜 (즉, mktime(0,0,0))를 기준으로 새로운 날짜를 만들었지 만, Swift에서 가장 쉬운 방법은 확실하지 않습니다.

아무에게도이 접근 방법에 대한 좋은 아이디어가 있습니까? 아마도 NSDate 나 비슷한 것이 가장 좋을까요?

답변

38

NSCalendar가 일 이전 어제보다 더 계산 unitFlags

func components(_ unitFlags: NSCalendarUnit, 
     fromDate startingDate: NSDate, 
      toDate resultDate: NSDate, 
       options opts: NSCalendarOptions) -> NSDateComponents 

패스 .Day를 사용 얻으려면 세 가지 경우 모두

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

방법을 가지고하는 데 도움이 day p 결과에서 로퍼 티 (roperty).

편집 :

이 시간 부분을 제거하여도 이전과 이후 날짜 is in을 고려하는 기능입니다. 스위프트 3

func dayDifferenceFromDate(timestamp : Int) -> String 
{ 
    let calendar = NSCalendar.currentCalendar() 
    let date = NSDate(timeIntervalSince1970: Double(timestamp)) 
    if calendar.isDateInYesterday(date) { return "Yesterday" } 
    else if calendar.isDateInToday(date) { return "Today" } 
    else if calendar.isDateInTomorrow(date) { return "Tomorrow" } 
    else { 
    let startOfNow = calendar.startOfDayForDate(NSDate()) 
    let startOfTimeStamp = calendar.startOfDayForDate(date) 
    let components = calendar.components(.Day, fromDate: startOfNow, toDate: startOfTimeStamp, options: []) 
    let day = components.day 
    if day < 1 { return "\(abs(day)) days ago" } 
    else { return "In \(day) days" } 
    } 
} 

업데이트 :

func dayDifference(from interval : TimeInterval) -> String 
{ 
    let calendar = NSCalendar.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 "\(abs(day)) days ago" } 
     else { return "In \(day) days" } 
    } 
} 
+0

감사합니다! 상단 부분이 완벽하게 보입니다. 아래쪽 부분은 10 시가 될 수 있지만 내일 오전 9 시가 될 수 있습니다. 내일 오전 11 시가되면 결과가 달라집니다. 아니면 내가 어떻게 작동하는지 잘못 이해 했습니까? – Ben

+0

좋은 물건, 다시 고마워. 내가 만든 유일한 변화는 음수를 없애기 위해 'abs'를 덧붙여서 며칠 전이었습니다.'return "\ (abs (day)) days ago"' – Ben

+0

물론 감사합니다 .-) – vadian

5

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

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

희망이

25

스위프트 3.0 : 또한

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

:

NSCalendar.current.isDateInWeekend(yourDate) 

일부 국가에서는 주말이 토요일 - 일요일과 다를 수 있으므로 달력에 따라 다릅니다.

사용자 업데이트를 추적하는 current 캘린더 대신 autoupdatingCurrent을 사용할 수도 있습니다.

NSCalendar.autoupdatingCurrent.isDateInToday(yourDate) 

업데이트 :

또한 Calendar를 사용할 수 있으며, NSCalendar에 대한 형의 별명입니다 당신은 같은 방법을 사용할 수 있습니다.

7

스위프트 4 업데이트 :

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

    calendar.isDateInYesterday(date) 
    calendar.isDateInToday(date) 
    calendar.isDateInTomorrow(date)