확인하는 방법 NSDate
오늘 소속 ?
에서의 처음 10자를 사용하여 확인했습니다 [aDate description]
. [[aDate description] substringToIndex:10]
문자열을 반환 "YYYY-MM-DD"
하므로 문자열을에서 반환 한 문자열과 비교했습니다 [[[NSDate date] description] substringToIndex:10]
.
더 빠르고 깔끔한 확인 방법이 있습니까?
감사.
확인하는 방법 NSDate
오늘 소속 ?
에서의 처음 10자를 사용하여 확인했습니다 [aDate description]
. [[aDate description] substringToIndex:10]
문자열을 반환 "YYYY-MM-DD"
하므로 문자열을에서 반환 한 문자열과 비교했습니다 [[[NSDate date] description] substringToIndex:10]
.
더 빠르고 깔끔한 확인 방법이 있습니까?
감사.
답변:
macOS 10.9 이상 및 iOS 8 이상에는 NSCalendar / Calendar에 정확히이 작업을 수행하는 방법이 있습니다!
- (BOOL)isDateInToday:(NSDate *)date
그래서 당신은 단순히 할 것입니다
목표 -C :
BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];
스위프트 3 :
let today = Calendar.current.isDateInToday(date)
날짜 구성 요소를 비교할 수 있습니다.
NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
[today month] == [otherDay month] &&
[today year] == [otherDay year] &&
[today era] == [otherDay era]) {
//do stuff
}
편집하다:
나는 스테판의 방법을 더 좋아한다. 나는 그것이 더 깨끗하고 이해하기 쉬운 if 문을 만든다고 생각한다.
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];
if([today isEqualToDate:otherDate]) {
//do stuff
}
크리스, 난 당신의 제안을 통합했습니다. 나는 시대가 무엇인지 찾아야했기 때문에 모르는 사람은 BC와 AD를 구분합니다. 이것은 아마도 대부분의 사람들에게는 불필요하지만 확인하기 쉽고 확실성을 추가하기 때문에 포함 시켰습니다. 속도가 빠르면 어쨌든 이것은 좋은 방법이 아닙니다.
참고 SO에 많은 답변 등은 7 년 후이 완전히 최신이 아닙니다. 스위프트에서는 이제 사용하십시오..isDateInToday
이것은 귀하의 질문에 대한 파생물이지만 "오늘"또는 "어제"로 NSDate를 인쇄하려면이 함수를 사용하십시오
- (void)setDoesRelativeDateFormatting:(BOOL)b
NSDateFormatter 용
오늘 날짜를 자정과 두 번째 날짜로 표준화하고 자정으로 표준화 한 다음 동일한 NSDate인지 비교하려고합니다.
에서 애플의 예를 여기에 두 번째 날짜와 비교를위한 방법을 정상화 자정 오늘 날짜에 수행 동일합니다 :
NSCalendar * gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
[gregorian components:
(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];
구성 요소, 시대 및 물건으로 저글링 할 필요가 없습니다.
NSCalendar는 기존 날짜의 특정 시간 단위를 시작하는 방법을 제공합니다.
이 코드는 오늘의 시작과 다른 날짜를 가져 와서 비교합니다. 이 NSOrderedSame
날짜로 평가 되면 두 날짜 모두 같은 날입니다. 오늘도 마찬가지입니다.
NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;
NSDate *now = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:beginningOfOtherDate];
if([today compare:beginningOfOtherDate] == NSOrderedSame) {
//otherDate is a date in the current day
}
extension NSDate {
func isToday() -> Bool {
let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!
components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
let otherDate = cal.dateFromComponents(components)!
return today.isEqualToDate(otherDate)
}
Swift 2.0에서 나를 위해 일했습니다.
최상의 답변의 신속한 버전 :
let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!
components = cal.components([.Era, .Year, .Month, .Day], fromDate:aDate);
let otherDate = cal.dateFromComponents(components)!
if(today.isEqualToDate(otherDate)) {
//do stuff
}
"캘린더 계산 수행"이라는 제목의 Apple 설명서 항목을 참조하십시오. [link] .
이 페이지의 목록 13에서는 일 사이의 자정 수를 결정하기 위해 다음을 사용한다고 제안합니다.
- (NSInteger)midnightsFromDate:(NSDate *)startDate toDate:(NSDate *)endDate
{
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSInteger startDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSEraCalendarUnit
forDate:startDate];
NSInteger endDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSEraCalendarUnit
forDate:endDate];
return endDay - startDay;
}
그런 다음 해당 방법을 사용하고 0을 반환하는지 확인하여 이틀이 같은지 확인할 수 있습니다.
보유한 날짜와 현재 날짜 사이의 시간 간격을 확인할 수도 있습니다.
[myDate timeIntervalSinceNow]
그러면 myDate와 현재 날짜 / 시간 사이의 시간 간격 (초)이 표시됩니다.
링크 .
편집 : 모두 참고 : [myDate timeIntervalSinceNow]는 myDate가 오늘인지 확실하게 결정하지 않는다는 것을 잘 알고 있습니다.
나는 누군가가 비슷한 것을 찾고 있고 [myDate timeIntervalSinceNow]가 유용하다면 여기에서 찾을 수 있도록이 대답을 그대로 둡니다.
timeIntervalSinceNow
다른 많은 게시물에서 다루는 것처럼 언급 할 필요도 없습니다 . 또한 초 검사로 일 비교 처리는 86400에 의해 오류가 발생하기 쉬운 부문을 장려
최상의 답변을 기반으로 한 Swift Extension :
extension NSDate {
func isToday() -> Bool {
let cal = NSCalendar.currentCalendar()
if cal.respondsToSelector("isDateInToday:") {
return cal.isDateInToday(self)
}
var components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:NSDate())
let today = cal.dateFromComponents(components)!
components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:self);
let otherDate = cal.dateFromComponents(components)!
return today.isEqualToDate(otherDate)
}
}
이 날짜 비교가 많으면 통화 calendar:components:fromDate
시간이 많이 걸립니다. 내가 한 일부 프로파일 링에 따르면, 그들은 꽤 비싸 보입니다.
예를 들어 어떤 날짜 배열에서 어느 NSArray *datesToCompare
날과 같은 날 을 결정하려고한다고 가정하면 NSDate *baseDate
다음과 같은 것을 사용할 수 있습니다 (위의 답변에서 부분적으로 조정).
NSDate *baseDate = [NSDate date];
NSArray *datesToCompare = [NSArray arrayWithObjects:[NSDate date],
[NSDate dateWithTimeIntervalSinceNow:100],
[NSDate dateWithTimeIntervalSinceNow:1000],
[NSDate dateWithTimeIntervalSinceNow:-10000],
[NSDate dateWithTimeIntervalSinceNow:100000],
[NSDate dateWithTimeIntervalSinceNow:1000000],
[NSDate dateWithTimeIntervalSinceNow:50],
nil];
// determine the NSDate for midnight of the base date:
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
fromDate:baseDate];
NSDate* theMidnightHour = [calendar dateFromComponents:comps];
// set up a localized date formatter so we can see the answers are right!
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
// determine which dates in an array are on the same day as the base date:
for (NSDate *date in datesToCompare) {
NSTimeInterval interval = [date timeIntervalSinceDate:theMidnightHour];
if (interval >= 0 && interval < 60*60*24) {
NSLog(@"%@ is on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
}
else {
NSLog(@"%@ is NOT on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
}
}
산출:
Nov 23, 2011 1:32:00 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:33:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:48:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 10:45:20 AM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 24, 2011 5:18:40 PM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Dec 5, 2011 3:18:40 AM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:32:50 PM is on the same day as Nov 23, 2011 1:32:00 PM
위의 많은 답변보다 쉬운 방법이 있습니다!
NSDate *date = ... // The date you wish to test
NSCalendar *calendar = [NSCalendar currentCalendar];
if([calendar isDateInToday:date]) {
//do stuff
}
이것은 아마도 NSDate 카테고리로 재 작업 될 수 있지만 다음을 사용했습니다.
// Seconds per day (24h * 60m * 60s)
#define kSecondsPerDay 86400.0f
+ (BOOL) dateIsToday:(NSDate*)dateToCheck
{
// Split today into components
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* comps = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit)
fromDate:[NSDate date]];
// Set to this morning 00:00:00
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
NSDate* theMidnightHour = [gregorian dateFromComponents:comps];
[gregorian release];
// Get time difference (in seconds) between date and then
NSTimeInterval diff = [dateToCheck timeIntervalSinceDate:theMidnightHour];
return ( diff>=0.0f && diff<kSecondsPerDay );
}
(그러나 원래 질문에서와 같이 두 날짜 문자열을 비교하면 거의 '깨끗합니다'..)
comps
즉시 0으로 설정할 때 만들 때 왜 시간, 분 및 초를 포함 합니까? 또한 시대를 포함시켜야한다고 생각합니다.
iOS7 및 이전 버전의 경우 :
//this is now => need that for the current date
NSDate * now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];
NSDateComponents * components = [calendar components:( NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: now];
[components setMinute:0];
[components setHour:0];
[components setSecond:0];
//this is Today's Midnight
NSDate *todaysMidnight = [calendar dateFromComponents: components];
//now timeIntervals since Midnight => in seconds
NSTimeInterval todayTimeInterval = [now timeIntervalSinceDate: todaysMidnight];
//now timeIntervals since OtherDate => in seconds
NSTimeInterval otherDateTimeInterval = [now timeIntervalSinceDate: otherDate];
if(otherDateTimeInterval > todayTimeInterval) //otherDate is not in today
{
if((otherDateTimeInterval - todayTimeInterval) <= 86400) //86400 == a day total seconds
{
@"yesterday";
}
else
{
@"earlier";
}
}
else
{
@"today";
}
now = nil;
calendar = nil;
components = nil;
todaysMidnight = nil;
NSLog("Thank you :-)");
에리카 사둔의 위대한 확인하십시오 NSDate extension
. 사용하기 매우 간단합니다. 여기 괜찮아 :
http://github.com/erica/NSDate-Extensions
이 게시물에 이미 있습니다 : https : //.com/a/4052798/362310
Swift 2.2 및 iOS 8 이전에 작동하는 강제 언 래핑이없는 정확하고 안전한 솔루션 :
func isToday() -> Bool {
let calendar = NSCalendar.currentCalendar()
if #available(iOS 8.0, *) {
return calendar.isDateInToday(self)
}
let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)
guard let today = calendar.dateFromComponents(todayComponents),
day = calendar.dateFromComponents(dayComponents) else {
return false
}
return today.compare(day) == .OrderedSame
}
다음은 허용 된 답변을 기반으로하지만 최신 API를 지원하는 2 센트 답변입니다. 참고 : 대부분의 타임 스탬프는 GMT이므로 Gregorian 캘린더를 사용하지만 적절하다고 생각되면 변경하십시오.
func isDateToday(date: NSDate) -> Bool {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
if calendar.respondsToSelector("isDateInToday:") {
return calendar.isDateInToday(date)
}
let dateComponents = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
let today = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: NSDate()))!
let dateToCompare = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: date))!
return dateToCompare == today
}
내 솔루션은 1970 년 이후로 며칠이 지 났는지 계산하여 정수 부분을 비교하는 것입니다.
#define kOneDay (60*60*24)
- (BOOL)isToday {
NSInteger offset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
NSInteger days =[self timeIntervalSince1970] + offset;
NSInteger currentDays = [[NSDate date] timeIntervalSince1970] + offset;
return (days / kOneDay == currentDays / kOneDay);
}
NSDate *dateOne = yourDate;
NSDate *dateTwo = [NSDate date];
switch ([dateOne compare:dateTwo])
{
case NSOrderedAscending:
NSLog(@”NSOrderedAscending”);
break;
case NSOrderedSame:
NSLog(@”NSOrderedSame”);
break;
case NSOrderedDescending:
NSLog(@”NSOrderedDescending”);
break;
}