Come posso calcolare i giorni tra il 1 ° gennaio 2010 e (ad esempio) il 3 febbraio 2010?
Come posso calcolare i giorni tra il 1 ° gennaio 2010 e (ad esempio) il 3 febbraio 2010?
Risposte:
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);
Ricorda, gli NSDate
oggetti rappresentano momenti esatti di tempo, non hanno alcuna informazione sul fuso orario associato. Quando si converte una stringa in una data utilizzando, ad esempio NSDateFormatter
, un , viene NSDateFormatter
convertita l'ora dal fuso orario configurato. Pertanto, il numero di secondi tra due NSDate
oggetti sarà sempre fuso orario.
Inoltre, questa documentazione specifica che l'implementazione del tempo di Cocoa non tiene conto dei secondi intercalari, quindi se hai bisogno di una tale precisione, dovrai eseguire la tua implementazione.
cocoa
e non cocoa-touch
quindi questa risposta si applica solo a Mac OS X.
Potresti voler usare qualcosa del genere:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Credo che questo metodo tenga conto di situazioni come le date che riguardano un cambiamento dell'ora legale.
NSDate
gli oggetti sono già indipendenti dal fuso orario. Le informazioni sul fuso orario vengono rimosse quando si analizzano le date, ad esempio NSDateFormatter
, in modo che gli NSDate
oggetti rappresentino momenti esatti nel tempo. Pertanto, se hai già startDate
e endDate
, questi due oggetti saranno distanti x un numero di secondi. I fusi orari non avranno nulla a che fare con questo.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
dove date1
e date2
sono NSDate
.
Inoltre, nota la definizione di NSTimeInterval
:
typedef double NSTimeInterval;
Dai un'occhiata a questo. Si occupa dell'ora legale e dell'anno bisestile poiché utilizzava il calendario iOS per il calcolo. Puoi modificare la stringa e le condizioni per includere minuti con ore e giorni.
+(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 @"";
}
Con Swift 5 e iOS 12, in base alle tue esigenze, puoi utilizzare uno dei due modi seguenti per trovare la differenza tra due date in giorni.
Calendar
il dateComponents(_:from:to:)
metodo diimport 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
il string(from:to:)
metodo diimport 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
Prova questo e vedi (intervallo di date con stringa):
// 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)
Puoi trovare la differenza convertendo la data in secondi e prendere l'intervallo di tempo dal 1970 per questo, quindi puoi trovare la differenza tra due date.
Per trovare la differenza, è necessario ottenere la data corrente e la data futura. Nel caso seguente, ho usato 2 giorni per un esempio della data futura. Calcolato da:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Prevediamo che il numero di secondi in 2 giorni sia 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