2010-06-26 20 views
6

Câu hỏi của tôi là REVERSE của điển hình "Làm cách nào để tìm hiểu xem NSDate có nằm trong khoảng từ startDate và endDate không?"Nhận tất cả NSDates BETWEEN startDate và endDate

Điều tôi muốn làm là tìm TẤT CẢ NSDATES (cho ngày, không phải giờ hoặc phút) xảy ra GIỮNG ngày bắt đầu và ngày kết thúc. Bao gồm những ngày đó sẽ là thích hợp hơn, mặc dù không cần thiết.

Ví dụ: (Tôi biết rằng những không đại diện cho NSDates, đây là những chỉ mang tính minh họa)

INPUT: STARTDATE = 6/23/10 20:11:30 ENDDATE = 6/27/10 02:15:00

OUTPUT: NSArray của: 6/23/10, 6/24/10, 6/25/10, 6/26/10, 6/27/10

tôi đừng bận tâm khi làm việc. Chỉ là tôi không biết bắt đầu từ đâu để tạo ra mã hiệu quả, mà không cần phải bước qua NSD từng chút một.

Trả lời

5

Thêm 24 giờ vào ngày bắt đầu cho đến khi bạn đi qua ngày kết thúc.

for (nextDate = startDate ; [nextDate compare:endDate] < 0 ; nextDate = [nextDate addTimeInterval:24*60*60]) { 
    // use date 
} 

Bạn có thể làm tròn ngày đầu tiên đến trưa hoặc nửa đêm trước khi bắt đầu vòng lặp nếu bạn quan tâm đến thời gian trong ngày.

+2

Tôi đã sử dụng "timeIntervalSinceDate:" thay vì "compare:" vì timeIntervalSinceDate trả về một giá trị số, mặc dù so sánh cũng hoạt động. Ngoài ra, "timeIntervalSinceDate" không còn được dùng nữa, vì vậy tôi đã sử dụng "dateByAddingTimeInterval:" Tôi đã nghĩ đến việc làm như thế này, nhưng không biết rằng tôi có thể định dạng cho các vòng như thế này. Cảm ơn! –

+0

addTimeInterval: không được dùng nữa kể từ iOS 4. –

+0

Điều này không có hiệu quả với những ngày có số giờ khác nhau do thời gian tiết kiệm ánh sáng ban ngày. –

9

Sử dụng một thể hiện NSCalendar để chuyển đổi bắt đầu của bạn NSDate dụ vào trong một instance NSDateComponents, thêm 1 ngày để các NSDateComponents và sử dụng NSCalendar để chuyển đổi đó trở lại một thể hiện NSDate. Lặp lại hai bước cuối cùng cho đến khi bạn đến ngày kết thúc.

+0

Điều này cũng hiệu quả, nhưng hơi lộn xộn hơn so với giải pháp rút gọn. –

+4

Messier? Không. Đúng hơn? Vâng. Giải pháp của Drawnonward không tính đến bất kỳ vấn đề nào có thể xuất hiện do tính đặc thù của lịch, chẳng hạn như thời gian tiết kiệm ánh sáng ban ngày vv. Sử dụng 'NSCalendar' chắc chắn là cách được Apple đề nghị. –

+0

NSCalendar quá mức cần thiết cho các ngày liên tục. Có ngày bắt đầu vào buổi trưa bao gồm tiết kiệm ánh sáng ban ngày. Thực tế là ngày có thể là một thứ hai tắt 24 giờ sẽ không quan trọng cho đến khi bạn lặp qua 30000 giây nhảy vọt và chỉ có bao giờ được 24. Ngày nhuận là 24 giờ. Sử dụng NSCalendar thêm các biến chứng không cần thiết vào một nhiệm vụ đơn giản. – drawnonward

2

Kể từ khi OS X 10.9 và iOS 8.0, có cách làm rất rõ ràng sau đây để thực hiện việc này. Nó cũng đề cập đến kết thúc của tháng nhảy.

let cal = NSCalendar.currentCalendar() 
let start = NSDate() 
let end = // some end date 

var next = start 
while !cal.isDate(next, inSameDayAsDate: end) { 
    next = cal.dateByAddingUnit(.Day, value: 1, toDate: next, options: [])! 
    // do something with `next` 
} 

Lưu ý rằng đối với các phiên bản hệ điều hành cũ hơn -isDate:inSameDayAsDate: có thể được thay thế bằng một số cuộc gọi, ví dụ: -components:fromDate:toDate:options:-dateByAddingUnit:value:toDate:options: có thể được thay thế bằng dateByAddingComponents:toDate:options:.

Các vấn đề liên quan