Como posso calcular os dias entre 1º de janeiro de 2010 e (por exemplo) 3 de fevereiro de 2010?
Como posso calcular os dias entre 1º de janeiro de 2010 e (por exemplo) 3 de fevereiro de 2010?
Respostas:
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);
Lembre-se de que os NSDate
objetos representam momentos exatos de tempo, eles não têm nenhuma informação de fuso horário associada. Quando você converte uma string em uma data usando, por exemplo NSDateFormatter
, um , o NSDateFormatter
converte a hora do fuso horário configurado. Portanto, o número de segundos entre dois NSDate
objetos sempre será independente do fuso horário.
Além disso, esta documentação especifica que a implementação do tempo do Cocoa não leva em conta os segundos bissextos, portanto, se você precisar de tal precisão, precisará fazer sua própria implementação.
cocoa
e não, cocoa-touch
portanto, esta resposta se aplica apenas ao Mac OS X.
Você pode querer usar algo assim:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Acredito que esse método é responsável por situações como datas que abrangem uma mudança no horário de verão.
NSDate
objetos já são agnósticos de fuso horário. As informações de fuso horário são removidas ao analisar datas com NSDateFormatter
, por exemplo , para que os NSDate
objetos representem momentos exatos no tempo. Portanto, se você já tiver startDate
e endDate
, esses dois objetos terão um intervalo de x segundos. Os fusos horários não terão nada a ver com isso.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
onde date1
edate2
estãoNSDate
.
Além disso, observe a definição de NSTimeInterval
:
typedef double NSTimeInterval;
Verifique isso. Ele cuida do horário de verão, ano bissexto, pois usa o calendário iOS para calcular. Você pode alterar a string e as condições para incluir minutos com horas e dias.
+(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 @"";
}
Com o Swift 5 e iOS 12, de acordo com suas necessidades, você pode usar uma das duas maneiras a seguir para encontrar a diferença entre duas datas em dias.
Calendar
o dateComponents(_:from:to:)
método deimport 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
o string(from:to:)
método deimport 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
Experimente e veja (intervalo de datas com String):
// 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)")
Swift 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)
Você pode encontrar a diferença convertendo a data em segundos e tomar o intervalo de tempo desde 1970 para isso e então você pode encontrar a diferença entre duas datas.
Para encontrar a diferença, você precisa obter a data atual e a data futura. No caso a seguir, usei 2 dias como um exemplo da data futura. Calculado por:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Esperamos que o número de segundos em 2 dias seja de 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