Як я можу обчислити дні між 1 січня 2010 року та (наприклад) 3 лютого 2010 року?
Як я можу обчислити дні між 1 січня 2010 року та (наприклад) 3 лютого 2010 року?
Відповіді:
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);
Пам'ятайте, що NSDate
об'єкти представляють точні моменти часу, вони не мають жодної пов'язаної інформації про часовий пояс. Коли ви перетворюєте рядок у дату, використовуючи, наприклад, an NSDateFormatter
, NSDateFormatter
перетворює час із налаштованого часового поясу. Тому кількість секунд між двома NSDate
об'єктами завжди буде агностичною за часовим поясом.
Крім того, ця документація визначає, що впровадження часу Cocoa не враховує високосних секунд, тому якщо вам потрібна така точність, вам потрібно буде прокрутити власну реалізацію.
cocoa
і не cocoa-touch
так, що ця відповідь стосується лише Mac OS X.
Ви можете використати щось подібне:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Я вважаю, що цей метод пояснює такі ситуації, як дати, які пов'язані зі зміною економії денного світла.
NSDate
Об'єкти вже агностики часового поясу. Інформація про часовий пояс видаляється при аналізі дат, наприклад NSDateFormatter
, щоб NSDate
об'єкти відображали точні моменти часу. Тому, якщо у вас вже є , startDate
і endDate
ці два об'єкти будуть х кількість секунд один від одного. Часові пояси тут ні до чого.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
де date1
і date2
є NSDate
.
Також зверніть увагу на визначення NSTimeInterval
:
typedef double NSTimeInterval;
Оформити це. Він піклується про перехід на літній час, високосний рік, оскільки для обчислення використовувався календар iOS. Ви можете змінити рядок та умови, включаючи хвилини з годинами та днями.
+(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 @"";
}
З Swift 5 та iOS 12, відповідно до ваших потреб, ви можете скористатися одним із двох наступних способів знайти різницю між двома датами в днях.
Calendar
російського dateComponents(_:from:to:)
методуimport 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
російського string(from:to:)
методуimport 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
Спробуйте це і подивіться (діапазон дат із рядком):
// 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)")
Швидкий 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)
Ви можете знайти різницю, перетворивши дату в секунди і взявши для цього інтервал часу з 1970 року, а потім ви зможете знайти різницю між двома датами.
Щоб знайти різницю, потрібно отримати поточну дату та дату в майбутньому. У наступному випадку я використав 2 дні для прикладу майбутньої дати. Обчислюється:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Ми очікуємо, що кількість секунд за 2 дні складе 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