2010-01-17 33 views

Trả lời

72

Hãy thử điều này:

NSCalendar *gregorian = 
    [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSUInteger dayOfYear = 
    [gregorian ordinalityOfUnit:NSDayCalendarUnit 
    inUnit:NSYearCalendarUnit forDate:[NSDate date]]; 
[gregorian release]; 
return dayOfYear; 

nơi date là ngày bạn muốn xác định ngày của năm. Tài liệu về phương pháp NSCalendar.ordinalityOfUnit là here.

+0

wow, điều này có thể đơn giản hóa mọi thứ, nó gần như là một câu trả lời cho câu hỏi khác của tôi, http://stackoverflow.com/questions/2078372/ Propably một tốt hơn một :) – Godisemo

-2

Với lớp NSDate. Sử dụng tin nhắn timeIntervalSinceDate. Nó sẽ trả lại cho bạn một giá trị NSTimeInterval (thực ra nó là một giá trị gấp đôi) đại diện cho số giây đã trôi qua kể từ ngày bạn muốn. Sau đó, thật dễ dàng để chuyển đổi từng giây.

Nếu bạn cắt bớt seconds/86400 sẽ cung cấp cho bạn ngày.

Hãy nói rằng bạn muốn ngày kể từ ngày 01 tháng 1 năm 2010.

// current date/time 
NSDate *now = [[NSData alloc] init]; 

// seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now 
NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]]; 

// days since January 1st 2010 00:00:00 (GMT -4) until now 
int days = (int)interval/86400; 
+0

Đừng quên thêm một, như giá trị mà bạn nhận được không dựa. – Guffa

+1

Vấn đề là bạn sẽ phải kiểm tra năm cho mỗi ngày trước khi bạn có thể tính toán. Bạn không muốn ngày 1 tháng 1 năm 2011 là ngày thứ 366 của năm – Godisemo

+0

Như Godisemo nói, bạn không thể dựa vào các hằng số lớn để tìm ra ngày. Còn những giây nhảy vọt thì sao? Hoặc những năm kỳ lạ trong quá khứ xa xôi mất tích suốt cả tuần? –

6

Vì vậy, các giải pháp tôi đưa ra là khá gọn gàng và đơn giản và không có trong bất kỳ cách nào phức tạp.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"D"]; 
NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue]; 
[formatter release]; 
return dayOfYear; 

Bí quyết ở đây mà tôi đã dành rất nhiều thời gian để tìm ra là sử dụng NSDateFormatter. "D" là cờ cho ngày trong năm.

Hy vọng rằng điều này hữu ích cho bạn, những người có cùng vấn đề với tôi.

+0

Một giải pháp gọn gàng, nhưng không phải là gọn gàng nhất. ;) Tôi nghĩ rằng bạn có một chút khó khăn trong suy nghĩ của ngày trong đơn vị của năm, tháng và ngày thay vì như là một dòng thời gian liên tục. Ngày thường được lưu trữ dưới dạng giây trôi qua (hoặc ngày hoặc mili giây hoặc 1/10000000 giây) từ một ngày đã định, một định dạng giúp bạn dễ dàng nhận được sự khác biệt từ đầu năm đến ngày cụ thể. – Guffa

+0

đúng, đó là điều khó khăn khi giải quyết vấn đề. Bạn gặp khó khăn trong một cách tiếp cận và không thể nghĩ ra lựa chọn thay thế. Cảm ơn – Godisemo

+0

Tôi làm cách nào để sử dụng phương pháp này để có được ngày hồi giáo trong năm? –

2

Sử dụng ARC và thay thế những biểu tượng phản đối, câu trả lời John Feminella của sẽ trông như thế này:

NSCalendar *greg = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; 
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]]; 
Các vấn đề liên quan