두 NS 날짜 사이의 일 수
의 두개사일수어결수있정까습니할떻 의 일수는 어떻게 할 수 있습니까?NSDate
값(시간도 고려)?
그NSDate
가치는 어떤 형태로든 존재합니다.[NSDate date]
takes.
특히 사용자가 iPhone 앱에서 비활성 상태로 들어가면 다음 값을 저장합니다.
exitDate = [NSDate date];
앱을 다시 열면 현재 시간이 표시됩니다.
NSDate *now = [NSDate date];
이제 다음을 구현하려고 합니다.
-(int)numberOfDaysBetweenStartDate:exitDate andEndDate:now
다음은 두 날짜 사이의 달력 일수를 결정하는 데 사용한 구현입니다.
+ (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime
{
NSDate *fromDate;
NSDate *toDate;
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate
interval:NULL forDate:fromDateTime];
[calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate
interval:NULL forDate:toDateTime];
NSDateComponents *difference = [calendar components:NSCalendarUnitDay
fromDate:fromDate toDate:toDate options:0];
return [difference day];
}
편집:
위의 환상적인 솔루션, 아래의 Swift 버전은 다음과 같은 확장 버전입니다.NSDate
:
extension NSDate {
func numberOfDaysUntilDateTime(toDateTime: NSDate, inTimeZone timeZone: NSTimeZone? = nil) -> Int {
let calendar = NSCalendar.currentCalendar()
if let timeZone = timeZone {
calendar.timeZone = timeZone
}
var fromDate: NSDate?, toDate: NSDate?
calendar.rangeOfUnit(.Day, startDate: &fromDate, interval: nil, forDate: self)
calendar.rangeOfUnit(.Day, startDate: &toDate, interval: nil, forDate: toDateTime)
let difference = calendar.components(.Day, fromDate: fromDate!, toDate: toDate!, options: [])
return difference.day
}
}
사용 사례에 따라 제거할 수 있는 약간의 포장 풀기 작업.
위의 솔루션은 현재 시간대 이외의 시간대에서도 작동하여 전 세계의 장소에 대한 정보를 보여주는 앱에 적합합니다.
여기 제가 찾은 최고의 해결책이 있습니다.NSDate 간의 단위 수를 결정하는 데 Apple이 승인한 방법을 사용하는 것 같습니다.
- (NSInteger)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2
{
NSUInteger unitFlags = NSCalendarUnitDay;
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0];
return [components day] + 1;
}
예를 들어, 몇 개월을 원하는 경우 'NSMonthCalendar'를 포함할 수 있습니다.단위 플래그로 '단위'를 지정합니다.
오리지널 블로거의 공을 인정하자면, 저는 여기에서 이 정보를 찾았습니다(위에서 수정한 약간의 실수가 있었지만): http://cocoamatic.blogspot.com/2010/09/nsdate-number-of-days-between-two-dates.html?showComment=1306198273659#c6501446329564880344
Swift 3.0 업데이트
extension Date {
func differenceInDaysWithDate(date: Date) -> Int {
let calendar = Calendar.current
let date1 = calendar.startOfDay(for: self)
let date2 = calendar.startOfDay(for: date)
let components = calendar.dateComponents([.day], from: date1, to: date2)
return components.day ?? 0
}
}
Swift 2.0 업데이트
extension NSDate {
func differenceInDaysWithDate(date: NSDate) -> Int {
let calendar: NSCalendar = NSCalendar.currentCalendar()
let date1 = calendar.startOfDayForDate(self)
let date2 = calendar.startOfDayForDate(date)
let components = calendar.components(.Day, fromDate: date1, toDate: date2, options: [])
return components.day
}
}
원본 솔루션
스위프트의 또 다른 해결책.
두 날짜 사이에 정확한 날짜 번호를 얻는 것이 목적이라면 다음과 같이 이 문제를 해결할 수 있습니다.
// Assuming that firstDate and secondDate are defined
// ...
var calendar: NSCalendar = NSCalendar.currentCalendar()
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDayForDate(firstDate)
let date2 = calendar.startOfDayForDate(secondDate)
let flags = NSCalendarUnit.DayCalendarUnit
let components = calendar.components(flags, fromDate: date1, toDate: date2, options: nil)
components.day // This will return the number of day(s) between dates
NSDate 클래스의 카테고리 방법으로 사용합니다.
// returns number of days (absolute value) from another date (as number of midnights beween these dates)
- (int)daysFromDate:(NSDate *)pDate {
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSInteger startDay=[calendar ordinalityOfUnit:NSCalendarUnitDay
inUnit:NSCalendarUnitEra
forDate:[NSDate date]];
NSInteger endDay=[calendar ordinalityOfUnit:NSCalendarUnitDay
inUnit:NSCalendarUnitEra
forDate:pDate];
return abs(endDay-startDay);
}
시작일을 포함하여 두 날짜 사이의 일 수가 필요했습니다. 예를 들어 14-2-2012와 16-2-2012 사이의 일 수는 3입니다.
+ (NSInteger)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2 {
NSUInteger unitFlags = NSDayCalendarUnit;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0];
NSInteger daysBetween = abs([components day]);
return daysBetween+1;
}
날짜를 어떤 순서로 제공하는지는 중요하지 않습니다.항상 양수를 반환합니다.
NSDate *lastDate = [NSDate date];
NSDate *todaysDate = [NSDate date];
NSTimeInterval lastDiff = [lastDate timeIntervalSinceNow];
NSTimeInterval todaysDiff = [todaysDate timeIntervalSinceNow];
NSTimeInterval dateDiff = lastDiff - todaysDiff;
dateDiff는 두 날짜 사이의 초 수가 됩니다.하루의 초수로 나눕니다.
@브라이언
브라이언의 대답은 좋지만 24시간 청크로 날짜 차이만 계산하고 달력 날짜 차이는 계산하지 않습니다.예를 들어, 12월 24일 23:59는 아직 하루라고 여겨지는 많은 신청의 목적으로 크리스마스 날로부터 1분 밖에 떨어져 있지 않습니다.Brian의 daysBetween 함수는 0을 반환합니다.
Brian의 원래 구현과 하루의 시작/끝을 차용하여 프로그램에 다음을 사용합니다. (NSDate의 하루의 시작 및 끝)
- (NSDate *)beginningOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:0];
[components setMinute:0];
[components setSecond:0];
return [cal dateFromComponents:components];
}
- (NSDate *)endOfDay:(NSDate *)date
{
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];
[components setHour:23];
[components setMinute:59];
[components setSecond:59];
return [cal dateFromComponents:components];
}
- (int)daysBetween:(NSDate *)date1 and:(NSDate *)date2 {
NSDate *beginningOfDate1 = [self beginningOfDay:date1];
NSDate *endOfDate1 = [self endOfDay:date1];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *beginningDayDiff = [calendar components:NSDayCalendarUnit fromDate:beginningOfDate1 toDate:date2 options:0];
NSDateComponents *endDayDiff = [calendar components:NSDayCalendarUnit fromDate:endOfDate1 toDate:date2 options:0];
if (beginningDayDiff.day > 0)
return beginningDayDiff.day;
else if (endDayDiff.day < 0)
return endDayDiff.day;
else {
return 0;
}
}
또 다른 접근 방식:
NSDateFormatter* dayFmt = [[NSDateFormatter alloc] init];
[dayFmt setTimeZone:<whatever time zone you want>];
[dayFmt setDateFormat:@"g"];
NSInteger firstDay = [[dayFmt stringFromDate:firstDate] integerValue];
NSInteger secondDay = [[dayFmt stringFromDate:secondDate] integerValue];
NSInteger difference = secondDay - firstDay;
보다우를성을(능)보다 합니다.timeIntervalSince...
시간대를 고려할 수 있고, 하루의 몇 초 짧거나 긴 간격으로 모호함이 없습니다.
NSDateComponents가 접근하는 것보다 조금 더 작고 덜 혼란스럽습니다.
Swift에서 이 작업을 수행하려고 하는 사람들을 위해 이 페이지를 방문하는 사람들을 위한 답변을 추가하는 것입니다.접근 방식은 거의 비슷합니다.
private class func getDaysBetweenDates(startDate:NSDate, endDate:NSDate) -> NSInteger {
var gregorian: NSCalendar = NSCalendar.currentCalendar();
let flags = NSCalendarUnit.DayCalendarUnit
let components = gregorian.components(flags, fromDate: startDate, toDate: endDate, options: nil)
return components.day
}
이 답변은 다음 방법의 토론 섹션에서 확인할 수 있습니다.
components(_:fromDate:toDate:options:)
다음은 Swift에서 Brian의 기능을 구현한 것입니다.
class func daysBetweenThisDate(fromDateTime:NSDate, andThisDate toDateTime:NSDate)->Int?{
var fromDate:NSDate? = nil
var toDate:NSDate? = nil
let calendar = NSCalendar.currentCalendar()
calendar.rangeOfUnit(NSCalendarUnit.DayCalendarUnit, startDate: &fromDate, interval: nil, forDate: fromDateTime)
calendar.rangeOfUnit(NSCalendarUnit.DayCalendarUnit, startDate: &toDate, interval: nil, forDate: toDateTime)
if let from = fromDate {
if let to = toDate {
let difference = calendar.components(NSCalendarUnit.DayCalendarUnit, fromDate: from, toDate: to, options: NSCalendarOptions.allZeros)
return difference.day
}
}
return nil
}
달력 날짜 또는 24시간 기간을 말씀하시는 건가요? 즉, 화요일은 수요일 하루 전날 오후 9시에 오전 6시에 말씀하시는 건가요, 아니면 하루 미만인 건가요?
전자를 말하는 것이라면, 그것은 약간 복잡하고 당신은 다음을 통해 조작에 의존해야 할 것입니다.NSCalendar
그리고.NSDateComponent
바로 기억이 안 나요
후자를 의미하는 경우, 기준 날짜 이후 날짜의 시간 간격을 구하고 다른 날짜에서 하나를 뺀 다음 24시간으로 나눕니다(24 * 60 * 60
간격을 대략적인 간격을 얻으려면 윤초를 포함하지 않습니다.
당신이 원하는 것인지 확실하지 않지만, 그것은 당신들 중 일부에게 도움이 될 수 있습니다. (저를 도와줬어요!)
제 목표는 두 날짜(24시간 미만의 차이) 사이에 "오버데이"일이 있는지 확인하는 것이었습니다.
저는 다음과 같이 했습니다(조금 구식인 것은 인정합니다).
NSDate *startDate = ...
NSDate *endDate = ...
다른 NSDateFormatter에 의해 이미 포맷된 NSDate(이것은 단지 이 목적을 위한 것입니다:)
NSDateFormatter *dayFormater = [[NSDateFormatter alloc]init];
[dayFormater setDateFormat:@"dd"];
int startDateDay = [[dayFormater stringFromDate:startDate]intValue];
int endDateDay = [[dayFormater stringFromDate:dateOn]intValue];
if (endDateDay > startDateDay) {
NSLog(@"day+1");
} else {
NSLog(@"same day");
}
어쩌면 이런 것이 이미 존재할지도 모르지만, 그것을 찾지 못했습니다.
팀
왜 그냥:
int days = [date1 timeIntervalSinceDate:date2]/24/60/60;
제가 찾은 해결책은 다음과 같습니다.
+(NSInteger)getDaysDifferenceBetween:(NSDate *)dateA and:(NSDate *)dateB {
if ([dateA isEqualToDate:dateB])
return 0;
NSCalendar * gregorian =
[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate * dateToRound = [dateA earlierDate:dateB];
int flags = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit);
NSDateComponents * dateComponents =
[gregorian components:flags fromDate:dateToRound];
NSDate * roundedDate = [gregorian dateFromComponents:dateComponents];
NSDate * otherDate = (dateToRound == dateA) ? dateB : dateA ;
NSInteger diff = abs([roundedDate timeIntervalSinceDate:otherDate]);
NSInteger daysDifference = floor(diff/(24 * 60 * 60));
return daysDifference;
}
여기서 저는 하루의 시작부터 시작할 첫 번째 날짜를 효과적으로 반올림한 다음 조나단이 위에서 제안한 것과 같이 차이를 계산하고 있습니다.
이를 위해 오픈 소스 클래스/라이브러리를 게시했습니다.
RelativeDateDescriptor를 살펴보십시오. 이를 사용하여 다음과 같은 시간 차이를 얻을 수 있습니다.
RelativeDateDescriptor *descriptor = [[RelativeDateDescriptor alloc] initWithPriorDateDescriptionFormat:@"%@ ago" postDateDescriptionFormat:@"in %@"];
// date1: 1st January 2000, 00:00:00
// date2: 6th January 2000, 00:00:00
[descriptor describeDate:date2 relativeTo:date1]; // Returns '5 days ago'
[descriptor describeDate:date1 relativeTo:date2]; // Returns 'in 5 days'
다음 NSDate 방법을 사용하는 이유는 무엇입니까?
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate
이렇게 하면 두 날짜 사이의 초 수가 반환되고 86,400으로 나누면 일 수를 얻을 수 있습니다!
언급URL : https://stackoverflow.com/questions/4739483/number-of-days-between-two-nsdates
'bestsource' 카테고리의 다른 글
Node Sass가 현재 환경을 아직 지원하지 않음: Linux 64비트(false 포함) (0) | 2023.05.29 |
---|---|
Moongoose 집계 $match가 ID와 일치하지 않습니다. (0) | 2023.05.29 |
구글 안드로이드가 .NET을 지원할 수 있을까요? (0) | 2023.05.29 |
Mongodb Aggregation 프레임워크가 맵/축소보다 빠릅니까? (0) | 2023.05.24 |
스칼라에서 목록 끝에 요소 추가 (0) | 2023.05.24 |