ฉันจะคำนวณวันระหว่าง 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
อบเจ็กต์แสดงถึงช่วงเวลาที่แน่นอนโดยไม่มีข้อมูลโซนเวลาที่เกี่ยวข้อง เมื่อคุณแปลงสตริงวันที่โดยใช้ e กรัม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
วัตถุทั้งสองนี้จะห่างกันxจำนวนวินาที โซนเวลาจะไม่เกี่ยวข้องกับมัน
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
's 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
's 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
ลองใช้และดู (ช่วงวันที่ที่มี 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)")
สวิฟต์ 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