Bagaimana cara menghitung hari antara 1 Jan 2010 dan (misalnya) 3 Feb 2010?
Bagaimana cara menghitung hari antara 1 Jan 2010 dan (misalnya) 3 Feb 2010?
Jawaban:
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);
Ingat, NSDate
objek mewakili momen waktu yang tepat, objek tidak memiliki informasi zona waktu terkait. Saat Anda mengonversi string menjadi tanggal menggunakan mis. An NSDateFormatter
, waktu akan NSDateFormatter
diubah dari zona waktu yang dikonfigurasi. Oleh karena itu, jumlah detik antara dua NSDate
objek akan selalu zona waktu.
Lebih lanjut, dokumentasi ini menetapkan bahwa penerapan waktu Cocoa tidak memperhitungkan detik kabisat, jadi jika Anda memerlukan akurasi seperti itu, Anda perlu menggulirkan penerapan Anda sendiri.
cocoa
dan bukan cocoa-touch
berarti jawaban ini hanya berlaku untuk Mac OS X.
Anda mungkin ingin menggunakan sesuatu seperti ini:
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate toDate: endDate options: 0];
days = [components day];
Saya percaya metode ini memperhitungkan situasi seperti tanggal yang mencakup perubahan dalam penghematan siang hari.
NSDate
objek sudah agnostik zona waktu. Informasi zona waktu dihapus saat mengurai tanggal dengan misalnya NSDateFormatter
, sehingga NSDate
objek mewakili momen tepat dalam waktu. Oleh karena itu, jika Anda sudah memiliki startDate
dan endDate
, kedua objek ini akan berjarak x jumlah detik. Zona waktu tidak ada hubungannya dengan itu.
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds
dimana date1
dan date2
berada NSDate
.
Perhatikan juga definisi dari NSTimeInterval
:
typedef double NSTimeInterval;
Lihat ini. Ini menangani penghematan siang hari, tahun kabisat seperti yang digunakan kalender iOS untuk menghitung. Anda dapat mengubah string dan ketentuan untuk menyertakan menit dengan jam dan hari.
+(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 @"";
}
Dengan Swift 5 dan iOS 12, sesuai kebutuhan Anda, Anda dapat menggunakan salah satu dari dua cara berikut untuk menemukan perbedaan antara dua tanggal dalam hari.
Calendar
's dateComponents(_:from:to:)
metodeimport 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:)
metodeimport 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
Coba ini dan lihat (rentang tanggal dengan 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)")
Cepat 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)
Anda dapat menemukan perbedaannya dengan mengubah tanggal dalam detik dan mengambil interval waktu sejak 1970 untuk ini dan kemudian Anda dapat menemukan perbedaan antara dua tanggal.
Untuk menemukan perbedaannya, Anda perlu mendapatkan tanggal sekarang dan tanggal di masa depan. Dalam kasus berikut, saya menggunakan 2 hari untuk contoh tanggal yang akan datang. Dihitung oleh:
2 days
* 24 hours
* 60 minutes
* 60 seconds
. Kami perkirakan jumlah detik dalam 2 hari menjadi 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