2011-07-25 33 views
8

Tôi đang cố gắng viết một vị từ cho các tác vụ "Đã hoàn thành gần đây", tức là hiển thị tác vụ nếu nó được hoàn thành trong vòng 7 ngày qua. Tôi nghĩ rằng tôi cần phải làm một cái gì đó như thế này: "nếu NOW < dateCompleted + 7 ngày".Vị trí dữ liệu chính với ngày

DateCompleted là một thuộc tính trên bảng, nhưng tôi không chắc chắn làm thế nào tôi có nghĩa vụ để có được giá trị của nó và thêm 7 ngày để nó từ trong vị từ. Tôi đoán tôi cần phải lấy giá trị thuộc tính đầu tiên trước khi viết NSPredicate, nhưng làm thế nào? Tôi không có quyền truy cập vào managedObject tại thời điểm này.

Điều này có thể được gần gũi các giải pháp, nhưng tôi không thể tìm ra cách để xác định 'oneWeek' và tôi không nghĩ rằng bạn chỉ có thể thêm giá trị khi xác định vị:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@ < todoCompletedDate + %@", [NSDate date], oneWeek]; 

Trả lời

17

Bạn gần như ở đó.

Trước tiên, bạn cần phải xác định phạm vi ngày của mình. Để làm điều đó, bạn sẽ muốn bắt đầu với ngày hôm nay và sau đó thêm một tuần giá trị ngày để tìm kết thúc của phạm vi hợp lệ. Khi bạn có phạm vi đó, bạn có thể tạo vị từ của mình để tìm tất cả các tác vụ có ngày đến hạn = = bắt đầu và < = kết thúc. Dưới đây là một chiết xuất từ ​​một số mã tôi đã viết để làm một cái gì đó rất giống nhau ...

NSDate *today = [NSDate date]; 
NSDate *startOfToday = [DateHelper startOfDay:today]; 
NSDate *endOfWeek = [DateHelper addDaysToDate:today daysToAdd:6]; 
return [NSPredicate predicateWithFormat:@"(dueDate >= %@) AND (dueDate <= %@) AND complete == 0", startOfToday, endOfWeek]; 
+0

Cảm ơn. Tôi muốn todoCompleteDate được trong vòng 7 ngày qua, nhưng tôi đã tìm ra nó nhờ vào câu trả lời của bạn. –

+5

câu trả lời khá hay nhưng bạn nên lưu ý sử dụng thư viện của bên thứ ba mà không đề cập đến chúng :) Tôi khá noob tôi đã có thời gian tìm ra địa ngục là DateHelper trong nền tảng :) – Zerho

+0

@ Zerho Nó cũng có thể là một lớp mà anh tự làm để tính toán tính toán ngày – Jasper

-1

Để có được sự khởi đầu ngày, bạn có thể sử dụng:

NSDate *date = [NSDate date]; 
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *dateComponents = [gregorianCalendar components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date]; 
NSDate *startDate = [gregorianCalendar dateFromComponents:dateComponents]; 

và để có được ngày kết thúc:

NSCalendar* gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents* dateComponents = [gregorianCalendar components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date]; 
[dateComponents setHour:23]; 
[dateComponents setMinute:59]; 
[dateComponents setSecond:59]; 
[dateComponents setDay:[dateComponents day]+7]; 
NSDate *endDate = [gregorianCalendar dateFromComponents:dateComponents]; 
+0

Không đối phó với các biến vị ngữ! – user2666705

0

Để nhận một tuần trước dữ liệu từ hôm nay. đang nhanh chóng

let calendar = NSCalendar.currentCalendar() 
let now = NSDate() 
let nowTimeStamp = self.getCurrentTimeStampWOMiliseconds(now) 

let sevenDaysAgo = calendar.dateByAddingUnit(.Day, value: -7, toDate: now, options: [])! 
let startDate = calendar.startOfDayForDate(sevenDaysAgo) 
let startDateTimeStamp = self.getCurrentTimeStampWOMiliseconds(startDate) 

let predicate1 = NSPredicate(format:"(iCreatedAt >= %@) AND (iCreatedAt < %@) AND location = %@", startDateTimeStamp, nowTimeStamp) 

Trong trường hợp của tôi có giá trị dấu thời gian của bài trong CoreData DB của tôi vì vậy tôi sử dụng bên dưới chức năng cũng để có được giá trị timestamp

func getCurrentTimeStampWOMiliseconds(dateToConvert: NSDate) -> String { 
     let objDateformat: NSDateFormatter = NSDateFormatter() 
     objDateformat.dateFormat = "yyyy-MM-dd HH:mm:ss" 
     let strTime: String = objDateformat.stringFromDate(dateToConvert) 
     let objUTCDate: NSDate = objDateformat.dateFromString(strTime)! 
     let milliseconds: Int64 = Int64(objUTCDate.timeIntervalSince1970) 
     let strTimeStamp: String = "\(milliseconds)" 
     return strTimeStamp 
    } 
Các vấn đề liên quan