2012-06-02 10 views
5

Tôi muốn lấy giờ và phút hiện tại làm số nguyên. Vì vậy, nếu bây giờ là 3:16 sáng, tôi muốn lấy hai số nguyên: 3 và 16.Trong mục tiêu-C, để có được giờ và phút hiện tại làm số nguyên, chúng ta cần sử dụng NSDateComponents và NSCalendar?

Nhưng có vẻ như [NSDate date] sẽ cho số giây kể từ năm 1970 hoặc có thể cung cấp chuỗi hiện tại đại diện thời gian, nhưng không có cách dễ dàng để có được chúng như là số nguyên?

Tôi thấy một bài đăng trong Getting current time, nhưng nó liên quan đến NSDateComponentsNSCalendar? Đó là cách quá phức tạp ... tất cả những gì cần thiết là một cái gì đó giống như

NSDate *date = [NSDate date]; 
int hour = [date getHour];  // which is not possible 

Có cách nào đơn giản hơn so với sử dụng 3 lớp NSDate, NSDateComponents, và NSCalendar để có được những giờ hiện tại là một số nguyên, hoặc thông thường, trong Objective -C, chúng ta có thường sử dụng ngôn ngữ C là localtimetm để lấy giờ làm số nguyên không?

+0

Tôi đã kiểm tra các tài liệu tham khảo, và tôi nghĩ rằng không có cách nào khác xung quanh này. NSDate có vẻ chỉ là số giây. – nhahtdh

+0

Bạn có thể thêm một danh mục trên NSDate và mở rộng nó để tính toán getHour bằng cách sử dụng một số giây để tính toán ngày, bạn có sẵn sàng làm điều đó không? –

Trả lời

9

NSDate chỉ giữ thời gian đã trôi qua kể từ ngày tham chiếu nhất định, để nhận được thêm ý nghĩa số này (ví dụ: sau khi chăm sóc DST, năm nhuận và tất cả các thứ thời gian ngu ngốc khác), bạn có sử dụng NSDateComponents với NSCalendar thích hợp.

+0

+1 Giải thích tốt – Adam

+8

Nói cách khác, tham chiếu 'NSDate' một thời điểm. Khoảnh khắc đó có thể được gọi là 3:16 giờ bạn đang ở đâu, nhưng khoảnh khắc đó có thể được biết đến là 6:16 pm hoặc thậm chí 12:46 sáng ở một nơi khác. Không có gì về khoảnh khắc * một mình * tương ứng với "3:16 am", bạn phải chỉ định múi giờ và lịch. –

+0

@KenThomases tốt hơn! +1 – user523234

17

Cách bạn diễn giải các giây từ năm 1970 tùy thuộc vào lịch bạn đang sử dụng. Đơn giản là không có lựa chọn nào khác. May mắn thay nó không phải là khó khăn để thiết lập. Xem 'Hướng dẫn lập trình dữ liệu và thời gian' cho nhiều ví dụ. Trong trường hợp của bạn:

// Assume you have a 'date' 
NSCalendar *gregorianCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *dateComps = [gregorianCal components: (NSHourCalendarUnit | NSMinuteCalendarUnit) 
               fromDate: date]; 
// Then use it 
[dateComps minute]; 
[dateComps hour]; 

Vì vậy, nó thực sự không phức tạp.

Cũng lưu ý rằng bạn có thể tạo ra một 'Lớp Thể loại' để đóng gói này như:

@interface NSDate (MyGregorianDateComponents) 
    - (NSInteger) getGregorianHour; 
    - (NSInteger) getGregorianMinute; 
    @end 
+0

Đọc lại câu hỏi. Có một liên kết. – Adam

1

lớp của tôi có thể giúp đỡ. https://github.com/TjeerdVurig/Vurig-Calendar/blob/master/Vurig%20Calendar/NSDate%2Bconvenience.m

tôi chắc chắn rằng bạn có thể tìm ra các phần phút :)

+0

bằng cách này, sau này có vẻ như các thành phần NSDateComponents muốn các cờ bit để nó có thể cung cấp dữ liệu theo yêu cầu một lần, thay vì tính toán mọi thứ một lần, và sau đó tính toán lại cho phút –

+0

Có Tôi đồng ý rằng sẽ tốt hơn cho tình huống này –

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