2010-11-05 18 views

Trả lời

22

EDSunriseSet là một trình bao bọc Objective-C mã nguồn mở và miễn phí cho các thường trình ngôn ngữ C được tạo bởi Paul Schlyter.

Tính toán được thực hiện hoàn toàn bằng các thủ tục mã C. EDSunrisetSet cầu những tính toán đến các lớp học Cocoa chung (NSDate, NSTimeZone, ...)

+1

Cái này phù hợp với tôi. Gần đây (tháng 1 năm 2013) đã cập nhật một số lỗi bộ nhớ, do đó nếu bạn đang sử dụng nó, hãy đảm bảo bạn nhận được mã mới nhất. – mpemburn

6

Tôi đã sử dụng thư viện có tên là SUNWAIT. Rất đơn giản, hiệu quả - dễ sử dụng!

+0

Bạn đã sử dụng ứng dụng này với Objective-C/for iOS chưa? Ngoài ra, có bất kỳ hướng dẫn bắt đầu nào không? – Moshe

+0

Không - chỉ thẳng C. Bạn có thể biên dịch nó dưới dạng tệp "C" chuẩn và chỉ cần gọi vào đó. (Đó là những gì tôi đã làm trong ứng dụng của tôi, nhưng nó không phải là một ứng dụng iPhone). – Brad

+0

Brad - Tôi có nên biên dịch riêng biệt hoặc đưa nó vào dự án của tôi và sử dụng các cuộc gọi API không? – Moshe

8

Tôi đã thực sự chuyển số KosherJava Library và lên kế hoạch sớm có mặt trên GitHub!

Edit:

KosherCocoa hiện đang sống trên GitHub! Nếu bạn không cần mã liên quan đến lịch hebrew, bạn có thể xóa tệp "lịch". Các tệp lớp được phân tách độc đáo thành các thư mục dựa trên các loại tính toán mà chúng thực hiện.

Chỉnh sửa: KosherCocoa chúng tôi sẽ được thay thế bằng bản cập nhật hiện đại và đầy đủ hơn ngay khi có thể. Liên kết trên bây giờ chỉ vào repo cũ.

+0

liên kết ở trên để KosherCocoa đã chết, nhưng có vẻ như có một vài bản sao vẫn còn trong github. https://github.com/search?q=koshercocoa – Cruinh

+0

Rất tiếc, tôi sẽ sửa chữa nó ngay! – Moshe

+1

@Cruinh - Tôi thực sự đang trong quá trình hiện đại hóa mã nguồn và kiểm tra đơn vị viết. – Moshe

1

Chỉ cần một lưu ý .. nếu bạn sử dụng Berkley một ... tốt nó không hoạt động (ở Úc ít nhất). Mặc dù nó bao gồm mã Paul Schlyter C, rất tuyệt.

Nếu bạn muốn nó hoạt động ở bất cứ nơi nào, tốt nhất là chỉ cần calc các ngày trong UTC.

Trong SunriseAndSunset.m, hãy thay thế mã từ tăng gấp đôi; bộ đôi; như sau:

sun_rise_set(theYear, theMonth, theDay, lon, lat, &rise, &set); 
int hours = HOURS(rise); 
int mins = MINUTES(rise); 
int sethrs = HOURS(set); 
int setmins = MINUTES(set); 

NSTimeInterval riseOffset = ((hours * 60) + mins) * 60; 
NSTimeInterval setOffset = ((sethrs * 60) + setmins) * 60; 

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
NSString *dateStr = [NSString stringWithFormat:@"%i-%02d-%02dT00:00:00+0000", theYear, theMonth, theDay]; 
NSDate *utcMidnight = [formatter dateFromString:dateStr]; 

NSDate *utcSunrise = [utcMidnight dateByAddingTimeInterval:riseOffset]; 
NSDate *utcSunset = [utcMidnight dateByAddingTimeInterval:setOffset]; 

[formatter release]; 
[gregorian release]; 

return [NSDictionary dictionaryWithObjectsAndKeys:utcSunrise, @"sunrise", utcSunset, @"sunset", nil]; 
+0

Có thể nó không hoạt động ở Úc vì bạn đã được đưa ra một ngày trong múi giờ GMT. Tôi đặt cược nó có '+ 0000' thay vì' + 1000' trong NSDate khi bạn đang gỡ lỗi. Lần sau sử dụng '[date descriptionInLocale: [NSLocale currentLocale]]' để gỡ lỗi ngày tháng. :-) –

+0

Khó nhớ lại điều đó nhưng tôi khá chắc chắn rằng không phải như vậy, nó còn liên quan nhiều hơn đến các giả định trong mã và không thử nghiệm trên các ngoại lệ. Nhưng dù sao, các công trình trên độc đáo và ví dụ của họ đã cứu tôi một thời gian. Vì vậy, đó là tốt! :) – DavidAWalsh

+0

Ah không phải lo lắng :-) Tôi đang sử dụng nó ở Úc vì vậy tôi hy vọng họ sửa lỗi. Dường như làm việc sau gần một tuần thử nghiệm. –

4

Hãy thử điều này: https://github.com/mourner/suncalc/

Rất rõ ràng và dễ dàng để thực hiện, mặc dù nó được viết bằng javascript nhưng nó rất dễ dàng để chuyển đổi nó để
Mục tiêu-C

Nó cũng hỗ trợ tính toán mặt trời, vị trí mặt trăng và tọa độ.

2

Sau khi không tìm thấy một thay thế Swift đơn giản, tôi đã tạo Solar: thư viện được xây dựng Swift cho Sunrise/Sunset.