Làm cách nào để tính toán những ngày từ ngày 1 tháng 1 năm 2010 đến (ví dụ) ngày 3 tháng 2 năm 2010?
Làm cách nào để tính toán những ngày từ ngày 1 tháng 1 năm 2010 đến (ví dụ) ngày 3 tháng 2 năm 2010?
Câu trả lời:
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);
Hãy nhớ rằng, NSDate
các đối tượng đại diện cho các khoảnh khắc thời gian chính xác, chúng không có bất kỳ thông tin múi giờ liên quan nào. Khi bạn chuyển đổi một chuỗi thành một ngày bằng cách sử dụng ví dụ: an NSDateFormatter
, thì sẽ NSDateFormatter
chuyển đổi thời gian từ múi giờ đã định cấu hình. Do đó, số giây giữa hai NSDate
đối tượng sẽ luôn là múi giờ bất khả tri.
Hơn nữa, tài liệu này chỉ định rằng thời gian triển khai của Cocoa không tính đến giây nhuận, vì vậy nếu bạn yêu cầu độ chính xác như vậy, bạn sẽ cần phải tự triển khai.
cocoa
và không cocoa-touch
nên câu trả lời này chỉ áp dụng cho Mac OS X.
Bạn có thể muốn sử dụng một cái gì đó như thế này:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Tôi tin rằng phương pháp này giải thích cho các tình huống chẳng hạn như các ngày kéo dài sự thay đổi trong tiết kiệm ánh sáng ban ngày.
NSDate
các đối tượng đã là bất khả tri về múi giờ. Thông tin múi giờ bị xóa khi phân tích cú pháp ngày với ví dụ NSDateFormatter
, để NSDate
các đối tượng đại diện cho các thời điểm chính xác. Do đó, nếu bạn đã có startDate
và endDate
, hai đối tượng này sẽ cách nhau x số giây. Múi giờ sẽ không liên quan gì đến nó.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
ở đâu date1
và date2
đang ở đâu NSDate
.
Ngoài ra, hãy lưu ý định nghĩa của NSTimeInterval
:
typedef double NSTimeInterval;
Kiểm tra này ra. Nó quan tâm đến việc tiết kiệm ánh sáng ban ngày, năm nhuận vì nó đã sử dụng lịch iOS để tính toán. Bạn có thể thay đổi chuỗi và điều kiện để bao gồm phút với giờ và ngày.
+(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 @"";
}
Với Swift 5 và iOS 12, tùy theo nhu cầu của bạn, bạn có thể sử dụng một trong hai cách sau để tìm sự khác biệt giữa hai ngày tính theo ngày.
Calendar
's dateComponents(_:from:to:)
phương phápimport 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
's string(from:to:)
phương phápimport 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
Hãy thử điều này và xem (phạm vi ngày với Chuỗi):
// 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)
Bạn có thể tìm thấy sự khác biệt bằng cách chuyển đổi ngày theo giây và mất khoảng thời gian kể từ năm 1970 cho việc này và sau đó bạn có thể tìm thấy sự khác biệt giữa hai ngày.
Để tìm ra sự khác biệt, bạn cần lấy ngày hiện tại và ngày trong tương lai. Trong trường hợp sau, tôi đã sử dụng 2 ngày để làm ví dụ về ngày trong tương lai. Được tính toán bởi:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Chúng tôi dự đoán số giây trong 2 ngày là 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