Jak mogę obliczyć liczbę dni między 1 stycznia 2010 r. A (na przykład) 3 lutego 2010 r.?
Jak mogę obliczyć liczbę dni między 1 stycznia 2010 r. A (na przykład) 3 lutego 2010 r.?
Odpowiedzi:
NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"];
NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];
int numberOfDays = secondsBetween / 86400;
NSLog(@"There are %d days in between the two dates.", numberOfDays);
Pamiętaj, że NSDate
obiekty reprezentują dokładne momenty czasu, nie mają żadnych skojarzonych informacji o strefie czasowej. Kiedy konwertujesz ciąg znaków na datę za pomocą np. An NSDateFormatter
, NSDateFormatter
konwertuje czas ze skonfigurowanej strefy czasowej. W związku z tym liczba sekund między dwoma NSDate
obiektami zawsze będzie niezależna od strefy czasowej.
Ponadto, dokumentacja ta określa, że implementacja czasu Cocoa nie uwzględnia sekund przestępnych, więc jeśli potrzebujesz takiej dokładności, będziesz musiał rzucić własną implementację.
cocoa
a cocoa-touch
więc nie, więc ta odpowiedź dotyczy tylko Mac OS X.
Możesz użyć czegoś takiego:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Uważam, że ta metoda uwzględnia sytuacje, takie jak daty obejmujące zmianę czasu letniego.
NSDate
obiekty są już niezależne od strefy czasowej. Informacje o strefie czasowej są usuwane podczas analizowania dat np. NSDateFormatter
, Aby NSDate
obiekty reprezentowały dokładne momenty w czasie. Dlatego jeśli już masz startDate
i endDate
, te dwa obiekty będą oddalone od siebie o x sekund. Strefy czasowe nie będą miały z tym nic wspólnego.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
gdzie date1
i date2
są NSDate
.
Zwróć również uwagę na definicję NSTimeInterval
:
typedef double NSTimeInterval;
Sprawdź to. Dba o czas letni, rok przestępny, ponieważ do obliczeń używał kalendarza iOS.Możesz zmienić ciąg i warunki, aby zawierały minuty z godzinami i dniami.
+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate
{
NSDateComponents *components;
NSInteger days;
NSInteger hour;
NSInteger minutes;
NSString *durationString;
components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0];
days = [components day];
hour = [components hour];
minutes = [components minute];
if(days>0)
{
if(days>1)
durationString=[NSString stringWithFormat:@"%d days",days];
else
durationString=[NSString stringWithFormat:@"%d day",days];
return durationString;
}
if(hour>0)
{
if(hour>1)
durationString=[NSString stringWithFormat:@"%d hours",hour];
else
durationString=[NSString stringWithFormat:@"%d hour",hour];
return durationString;
}
if(minutes>0)
{
if(minutes>1)
durationString = [NSString stringWithFormat:@"%d minutes",minutes];
else
durationString = [NSString stringWithFormat:@"%d minute",minutes];
return durationString;
}
return @"";
}
Dzięki Swift 5 i iOS 12, w zależności od potrzeb, możesz użyć jednego z dwóch poniższych sposobów, aby znaleźć różnicę między dwiema datami w dniach.
Calendar
z dateComponents(_:from:to:)
metodyimport Foundation
let calendar = Calendar.current
let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
let dateComponents = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)
print(dateComponents) // prints: day: 1621 isLeapMonth: false
print(String(describing: dateComponents.day)) // prints: Optional(1621)
DateComponentsFormatter
z string(from:to:)
metodyimport Foundation
let calendar = Calendar.current
let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [NSCalendar.Unit.day]
let elapsedTime = formatter.string(from: startDate, to: endDate)
print(String(describing: elapsedTime)) // prints: Optional("1,621 days")
Swift 4
Spróbuj tego i zobacz (zakres dat ze stringiem):
// Start & End date string
let startingAt = "01/01/2018"
let endingAt = "08/03/2018"
// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()
// Actual operational logic
var dateRange: [String] = []
while startDate <= endDate {
let stringDate = dateFormatter.string(from: startDate)
startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
dateRange.append(stringDate)
}
print("Resulting Array - \(dateRange)")
Szybki 3
var date1 = Date(string: "2010-01-01 00:00:00 +0000")
var date2 = Date(string: "2010-02-03 00:00:00 +0000")
var secondsBetween: TimeInterval = date2.timeIntervalSince(date1)
var numberOfDays: Int = secondsBetween / 86400
print(numberOfDays)
Możesz znaleźć różnicę, przeliczając datę w sekundach i biorąc dla tego przedział czasu od 1970 r., A następnie możesz znaleźć różnicę między dwiema datami.
Aby znaleźć różnicę, musisz uzyskać aktualną datę i datę w przyszłości. W poniższym przypadku użyłem 2 dni jako przykład przyszłej daty. Obliczone przez:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Oczekujemy, że liczba sekund w ciągu 2 dni wyniesie 172 800.
// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)
// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration
print(secondsInterval) // 172800.0