SORU
6 AĞUSTOS 2009, PERŞEMBE


Nasıl iPhone üzerinde yıl, ay, gün, saat, dakika ve saniye içine bir NSTimeİnterval yıkmak mı?

Yayılan yıllık bir zaman aralığı var ve saniye için aşağı her zaman yılın bileşenleri istiyorum.

İlk aklıma gelen olduğu için tamsayı bölme zaman aralığını saniye içinde bir yıl, çıkarma bir çalışan toplam saniye, bölen tarafından saniye bir ay, çıkarma dan çalışan toplam.

Sadece kıvrık ve kıvrık gibi görünen bir şey yaptığınız zaman, muhtemelen bir yerleşik yöntem olduğunu okudum.

Orada mı?

Alex 2. benim koda entegre yöntemi.

Bir yöntem arayüzü benim bir UİDatePicker tarafından çağrıldı.

NSDate *now = [NSDate date];
NSDate *then = self.datePicker.date;
NSTimeInterval howLong = [now timeIntervalSinceDate:then];

NSDate *date = [NSDate dateWithTimeIntervalSince1970:howLong];
NSString *dateStr = [date description];
const char *dateStrPtr = [dateStr UTF8String];
int year, month, day, hour, minute, sec;

sscanf(dateStrPtr, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &sec);
year -= 1970;

NSLog(@"%d years\n%d months\n%d days\n%d hours\n%d minutes\n%d seconds", year, month, day, hour, minute, sec);

Tarihi tarihi 1 yıl geçmiş ve 1 gün için seçici başladığımda anladım:

1 yıl 1 ay 1 gün 16 saat 0 dakika 20 saniye

1 ay ve 16 saat kapalı olan. Eğer tarih geçmişte 1 gün için seçici kurdum, aynı miktarda duyuyorum.

Güncelleme: Doğum günün belirli yıllarda yaşınız hesaplayan bir uygulama var (bir UİDatePicker kümesi), henüz çoğu kapalı idi. Bu bir yanlışlık olduğunu kanıtlıyor, ama nereden geldiğini çözemedim.

CEVAP
6 EYLÜL 2009, Pazar


Kısa Açıklama

  1. Sadece başka bir yaklaşım JBRWilkinson ama bazı kodlar ekleyerek cevap tamamlamak için. Ayrıca Alex Reynolds yorum için bir çözüm sunuyor.

  2. NSCalendar yöntemi kullanın:

    • (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts

    • "Bir NSDateComponents belirtilen bileşenleri kullanarak nesne olarak, verilen iki tarih arasındaki farkı döndürür". (API belgelerine).

  3. Yıkmak istediğiniz NSTimeİnterval olan 2 NSDate oluşturun. (NSTimeİnterval bu adımı yapmanıza gerek yok 2 NSDate karşılaştırılması söz konusu bile NSTimeİnterval lazım, sadece geçerli NSCalendar yöntemi tarihleri).

  4. NSDateComponents, teklifleri alın

Örnek Kod

// The time interval 
NSTimeInterval theTimeInterval = ...;

// Get the system calendar
NSCalendar *sysCalendar = [NSCalendar currentCalendar];

// Create the NSDates
NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1]; 

// Get conversion to months, days, hours, minutes
NSCalendarUnit unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit;

NSDateComponents *breakdownInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];
NSLog(@"Break down: %i min : %i hours : %i days : %i months", [breakdownInfo minute], [breakdownInfo hour], [breakdownInfo day], [breakdownInfo month]);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ColdfusTion

    ColdfusTion

    3 Aralık 2007
  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007
  • Smith Micro Graphics

    Smith Micro

    15 Mayıs 2008