두 NSDate 비교 및 시간 성분 무시
두 NSDate를 비교하는 가장 효율적이고 권장되는 방법은 무엇입니까?시간에 상관없이 두 날짜가 같은지 확인하고 시간을 사용하는 코드를 작성하기 시작했습니다.IntervalSinceDate: NSDate 클래스 내의 메서드이며 이 값의 정수를 하루의 초 수로 나눈 값을 가져옵니다.이것은 긴 바람이 부는 것 같고 저는 명백한 것을 놓치고 있는 것 같습니다.
제가 고치려는 코드는 다음과 같습니다.
if (!([key compare:todaysDate] == NSOrderedDescending))
{
todaysDateSection = [eventSectionsArray count] - 1;
}
여기서 key 및 todayDate는 NSDate 개체이고 todayDate는 다음을 사용하여 만듭니다.
NSDate *todaysDate = [[NSDate alloc] init];
안부 전해요
데이브
개체의 "시작일" 날짜를 지정할 수 있는 옵션이 다른 응답에 없다는 것이 놀랍습니다.
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date1 interval:NULL forDate:date1];
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date2 interval:NULL forDate:date2];
은 정설을 합니다.date1
그리고.date2
그들 각자의 날들의 시작까지.만약 그들이 같다면, 그들은 같은 날에 있습니다.
또는 이 옵션:
NSUInteger day1 = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit: forDate:date1];
NSUInteger day2 = [[NSCalendar currentCalendar] ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date2];
은 정설을 합니다.day1
그리고.day2
▁if값인▁are,적의. 만약 그들이 , 만약 그들이 같다면, 그들은 같은 날에 있습니다.
비교를 수행하기 전에 날짜의 시간을 00:00:00으로 설정합니다.
unsigned int flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:flags fromDate:date];
NSDate* dateOnly = [calendar dateFromComponents:components];
// ... necessary cleanup
그런 다음 날짜 값을 비교할 수 있습니다.참조 설명서의 개요를 참조하십시오.
iOS 8과 함께 NSC 캘린더에 도입된 새로운 방법이 있습니다.
- (NSComparisonResult)compareDate:(NSDate *)date1 toDate:(NSDate *)date2 toUnitGranularity:(NSCalendarUnit)unit NS_AVAILABLE(10_9, 8_0);
중요한 단위에 대한 세분성을 설정합니다.이렇게 하면 다른 모든 단위는 무시되고 선택한 단위와의 비교가 제한됩니다.
iOS8 이상의 경우, 두 날짜가 같은 날에 발생하는지 확인하는 것은 다음과 같이 간단합니다.
[[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2]
설명서 참조
다음은 모든 답변의 요약입니다.
NSInteger interval = [[[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: date1
toDate: date2
options: 0] day];
if(interval<0){
//date1<date2
}else if (interval>0){
//date2<date1
}else{
//date1=date2
}
던컨 C 접근법을 사용했고, 그가 저지른 실수를 고쳤습니다.
-(NSInteger) daysBetweenDate:(NSDate *)firstDate andDate:(NSDate *)secondDate {
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSDateComponents *components = [currentCalendar components: NSDayCalendarUnit fromDate: firstDate toDate: secondDate options: 0];
NSInteger days = [components day];
return days;
}
저는 다음과 같은 작은 활용 방법을 사용합니다.
-(NSDate*)normalizedDateWithDate:(NSDate*)date
{
NSDateComponents* components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
fromDate: date];
return [calendar_ dateFromComponents:components]; // NB calendar_ must be initialized
}
(▁(다▁calledar분니)라는 아이바가 필요합니다.calendar_
포는하를 NSCalendar
.)
이를 사용하면 다음과 같은 날짜인지 쉽게 확인할 수 있습니다.
[[self normalizeDate:aDate] isEqualToDate:[self normalizeDate:[NSDate date]]];
([NSDate date]
현재 날짜 및 시간을 반환합니다.)
이것은 물론 그레고리가 제안하는 것과 매우 유사합니다.인 것을 많이 만드는 경향이 있다는 것입니다.NSDate
물건들.날짜를 많이 처리할 경우 구성 요소를 직접 비교하거나 작업하는 등 다른 방법을 사용하는 것이 좋습니다.NSDateComponents
대신 NSDates
.
답은 모든 사람들이 생각하는 것보다 간단합니다.NSC 캘린더에 메서드가 있습니다.
components:fromDate:toDate:options
이 방법을 사용하면 원하는 단위를 사용하여 두 날짜 간의 차이를 계산할 수 있습니다.
따라서 다음과 같은 방법을 작성합니다.
-(NSInteger) daysBetweenDate: (NSDate *firstDate) andDate: (NSDate *secondDate)
{
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSDateComponents components* = [currentCalendar components: NSDayCalendarUnit
fromDate: firstDate
toDate: secondDate
options: 0];
NSInteger days = [components days];
return days;
}
위의 방법이 0을 반환하면 두 날짜가 같은 날짜입니다.
iOS 8.0부터는 다음을 사용할 수 있습니다.
NSCalendar *calendar = [NSCalendar currentCalendar];
NSComparisonResult dateComparison = [calendar compareDate:[NSDate date] toDate:otherNSDate toUnitGranularity:NSCalendarUnitDay];
결과가 예를 들어 NSOrderDescending일 경우 otherDate는 [NSDate date] 이전입니다.
이 방법은 NSC 캘린더 설명서에는 없지만 iOS 7.1에서 iOS 8.0 API의 차이점에 있습니다.
Swift 3에서 코딩하는 개발자용
if(NSCalendar.current.isDate(selectedDate, inSameDayAs: NSDate() as Date)){
// Do something
}
Swift 3를 사용하면 필요에 따라 다음 두 가지 패턴 중 하나를 선택하여 문제를 해결할 수 있습니다.
#1. 사용하기compare(_:to:toGranularity:)
방법
Calendar
라는 메서드가 있습니다.compare(_:to:toGranularity:)
에는 다음과 같은 선언이 있습니다.
func compare(_ date1: Date, to date2: Date, toGranularity component: Calendar.Component) -> ComparisonResult
지정된 날짜를 지정된 구성 요소와 비교하여 보고합니다.
orderedSame
지정된 구성 요소와 모든 더 큰 구성 요소에서 동일한 경우, 그렇지 않으면 다음 중 하나가 됩니다.orderedAscending
또는orderedDescending
.
아래의 Playground 코드는 사용하기에 핫을 표시합니다.
import Foundation
let calendar = Calendar.current
let date1 = Date() // "Mar 31, 2017, 2:01 PM"
let date2 = calendar.date(byAdding: .day, value: -1, to: date1)! // "Mar 30, 2017, 2:01 PM"
let date3 = calendar.date(byAdding: .hour, value: 1, to: date1)! // "Mar 31, 2017, 3:01 PM"
/* Compare date1 and date2 */
do {
let comparisonResult = calendar.compare(date1, to: date2, toGranularity: .day)
switch comparisonResult {
case ComparisonResult.orderedSame:
print("Same day")
default:
print("Not the same day")
}
// Prints: "Not the same day"
}
/* Compare date1 and date3 */
do {
let comparisonResult = calendar.compare(date1, to: date3, toGranularity: .day)
if case ComparisonResult.orderedSame = comparisonResult {
print("Same day")
} else {
print("Not the same day")
}
// Prints: "Same day"
}
#2. 사용하기dateComponents(_:from:to:)
Calendar
라는 메서드가 있습니다.dateComponents(_:from:to:)
에는 다음과 같은 선언이 있습니다.
func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
두 날짜 간의 차이를 반환합니다.
아래의 Playground 코드는 사용하기에 핫을 표시합니다.
import Foundation
let calendar = Calendar.current
let date1 = Date() // "Mar 31, 2017, 2:01 PM"
let date2 = calendar.date(byAdding: .day, value: -1, to: date1)! // "Mar 30, 2017, 2:01 PM"
let date3 = calendar.date(byAdding: .hour, value: 1, to: date1)! // "Mar 31, 2017, 3:01 PM"
/* Compare date1 and date2 */
do {
let dateComponents = calendar.dateComponents([.day], from: date1, to: date2)
switch dateComponents.day {
case let value? where value < 0:
print("date2 is before date1")
case let value? where value > 0:
print("date2 is after date1")
case let value? where value == 0:
print("date2 equals date1")
default:
print("Could not compare dates")
}
// Prints: date2 is before date1
}
/* Compare date1 and date3 */
do {
let dateComponents = calendar.dateComponents([.day], from: date1, to: date3)
switch dateComponents.day {
case let value? where value < 0:
print("date2 is before date1")
case let value? where value > 0:
print("date2 is after date1")
case let value? where value == 0:
print("date2 equals date1")
default:
print("Could not compare dates")
}
// Prints: date2 equals date1
}
int interval = (int)[firstTime timeIntervalSinceDate:secondTime]/(60*60*24);
if (interval!=0){
//not the same day;
}
제 솔루션은 NSDateFormatter를 사용한 두 가지 변환이었습니다.
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyyMMdd"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
NSDate *today = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *todayString=[dateFormat stringFromDate:today];
NSDate *todayWithoutHour=[dateFormat dateFromString:todayString];
if ([today compare:exprDate] == NSOrderedDescending)
{
//do
}
NSDate에 관한 문서는 다음을 나타냅니다.compare:
그리고.isEqual:
방법은 여전히 시간에 영향을 미치지만 기본적인 비교를 수행하고 결과를 정렬합니다.
작업을 관리하는 가장 간단한 방법은 새 작업을 생성하는 것입니다.isToday
다음과 같은 취지의 방법:
- (bool)isToday:(NSDate *)otherDate
{
currentTime = [however current time is retrieved]; // Pardon the bit of pseudo-code
if (currentTime < [otherDate timeIntervalSinceNow])
{
return YES;
}
else
{
return NO;
}
}
이것은 특히 못생긴 고양이입니다. 하지만 다른 방법이 있습니다.우아하다고는 할 수 없지만 iOS에서 날짜/시간 지원을 받을 수 있을 정도로 가깝습니다.
bool isToday = [[NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterNoStyle] isEqualToString:[NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterNoStyle]];
NSUInteger unit = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit;
NSDateComponents *comp = [cal components:unit
fromDate:nowDate
toDate:setDate
options:0];
NSString *dMonth;
dMonth = [NSString stringWithFormat:@"%02ld",comp.month];
NSString *dDay;
dDay = [NSString stringWithFormat:@"%02ld",comp.day + (comp.hour > 0 ? 1 : 0)];
하루 차이를 고치기 위해 시간도 비교합니다.
언급URL : https://stackoverflow.com/questions/1854890/comparing-two-nsdates-and-ignoring-the-time-component
'IT' 카테고리의 다른 글
시작 및 종료 인덱스가 주어지면 C에서 문자열의 일부를 복사하려면 어떻게 해야 합니까? (0) | 2023.08.21 |
---|---|
PHP와 Ajax를 사용하여 배열을 Javascript로 전달하는 방법은 무엇입니까? (0) | 2023.08.21 |
Backbone.js를 사용하여 수집 폴링 (0) | 2023.08.21 |
ASP.NET 윈도우즈 인증 로그아웃 (0) | 2023.08.21 |
Powershell을 통해 Windows 기능을 활성화하는 방법 (0) | 2023.08.21 |