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 5와 iOS 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는 기본적으로 다음을 수행할 수 있습니다.
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
'codememo' 카테고리의 다른 글
| Safari 및 Chrome에서 작동하지 않는 jQuery를 사용하여 포커스 텍스트 선택 (0) | 2023.10.30 |
|---|---|
| 팬더에서 열에서 False 또는 True가 발생한 횟수 (0) | 2023.10.30 |
| 캔버스 요소에 간단한 onClick 이벤트 핸들러를 추가하려면 어떻게 해야 합니까? (0) | 2023.10.30 |
| Intellij가 application.yml에서 속성을 인식하도록 하는 방법 (0) | 2023.10.30 |
| 목록 C#에 중복 요소 추가 안 함 (0) | 2023.10.30 |