Obj-c

2009-02-21 28 views
21

'da günlere, dakikalara ve saatlere birkaç saniye dönüştürün Objektif c'de, bir tamsayı (saniyeleri temsil eden) günlere, dakikalara, saatlere nasıl dönüştürebilirim?Obj-c

Teşekkürler!

cevap

41

Bu durumda, yalnızca bölmeniz gerekir. Böyle 1983'te 19 Ocak 3 de sonra on milyon saniye içinde gün sayısı olarak daha sofistike tarih hesaplamaları için

days = num_seconds/(60 * 60 * 24); 
num_seconds -= days * (60 * 60 * 24); 
hours = num_seconds/(60 * 60); 
num_seconds -= hours * (60 * 60); 
minutes = num_seconds/60; 

, sen NSDateComponents birlikte NSCalendar sınıfını kullanırsınız. Apple'ın tarih ve saat programlama rehberi burada size yardımcı olur.

+0

Teşekkür ederiz. Bununla birlikte, bazı yöntemlerle inşa edilmiş olacağını umuyordum. – higginbotham

+0

@higginbotham - Size yardımcı olması durumunda bu cevabı doğru olarak işaretlemelisiniz. – Moshe

32

bu deneyin

int forHours = seconds/3600, 
remainder = seconds % 3600, 
forMinutes = remainder/60, 
forSeconds = remainder % 60; 

ve aynı prosedür kaynaklı

+2

Bu daha temiz ve daha özlü bir yoldur. –

+0

İyi yöntem.saniye tamsayı değilse, o zaman ** geri kalan = saniye% 3600 ** gibi işlemleri yapamayız. – Gangadhar

+0

Soru aslında bir tamsayı olduğunu belirtti. –

3

kullanın yerleşik fonksiyon strftime izleyerek günler, haftalar, aylar ve yıllar olarak daha fazla bilgi almak için kullanabilirsiniz() :, dokümanına Apple tarafından tavsiye olarak

static char timestr[80]; 
char * HHMMSS (time_t secs) 
{ 
    struct tm ts; 
    ts = *localtime(&secs); 
    strftime(timestr, sizeof(timestr), "%a %b %d %H:%M:%S %Y %Z", &ts); // "Mon May 1, 2012 hh:mm:ss zzz" 
    return timestr; 
} 
6

amaç-c en çok tercih edilen şekilde, bu olabilir.

NSDate *startDate = [NSDate date]; 
    NSDate *endDate = [NSDate dateWithTimeInterval:(365*24*60*60*3+24*60*60*129) sinceDate:startDate]; 

    NSCalendar *gregorian = [[NSCalendar alloc] 
          initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSDateComponents *components = [gregorian components:unitFlags 
               fromDate:startDate 
                toDate:endDate options:0]; 
    NSInteger years = [components year]; 
    NSInteger months = [components month]; 
    NSInteger days = [components day]; 
    NSLog(@"years = %ld months = %ld days = %ld",years,months,days); 

, tamsayı "tanımsız" olacaktır unitFlags tanımlanmıyo bileşenleri almak için değil emin olun.

+0

, hesaplama, DTS veya "startDate" ile "endDate" arasında herhangi bir şeye düşecek şekilde gerçekleştirilirse bu kırılmayacak mıdır? –

7

Bu eski bir yazı olduğunu biliyorum ama yine de paylaşmak istedim. Aşağıdaki kod, kullandığım koddur.

int seconds = (totalSeconds % 60); 
int minutes = (totalSeconds % 3600)/60; 
int hours = (totalSeconds % 86400)/3600; 
int days = (totalSeconds % (86400 * 30))/86400; 

İlk satır - Bir kaç saniye içinde saniye sayısına bölünürken kalan süreyi saniye olarak alırız.

İkinci satır - Bir saat içinde saniye sayısına bölünerek kalan süreyi saniye olarak alırız. Sonra bunu bir dakika içinde saniye olarak böleriz.

Üçüncü satır - Bir saniyedeki saniye sayısına bölünerek kalan süreyi saniye olarak alırız. Sonra bunu bir saat içinde saniye sayısına böleriz.

Dördüncü satır - Bir aydaki saniye sayısına bölünerek ikinci kalanını alırız. Sonra bunu bir günde saniyelerle bölüyoruz. Biz sadece ... Gün aşağıdaki

int days = totalSeconds/86400; 

kullanabilirsiniz Ama biz yukarıda çizgiyi kullanılan ve üzerinde devam etmek ve biz 1 ay ve 30 gün ile sona ereceğini ay olsun istiyorsa biz sadece almak istediğinde 1 ay.

Xcode'ta bir Playground açın ve deneyin.

+2

Bu, en iyi cevabı – Clint

0
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
    Date dateObj1=null; 
    Date dateObj2=null; 
    try { 
     // String format = "MM/dd/yyyy hh:mm:ss"; 
     dateObj1 = sdf.parse(Appconstant.One_One_time); 
     dateObj2 = sdf.parse(Appconstant.One_Two_time); 
     Log.e(TAG, "dateObj12" + dateObj1.toString() + "---" + dateObj2.toString()); 
     DecimalFormat crunchifyFormatter = new DecimalFormat("###,###"); 
     long diff = dateObj2.getTime() - dateObj1.getTime(); 
     /*int diffDays = (int) (diff/(24 * 60 * 60 * 1000)); 
     System.out.println("difference between days: " + diffDays); 
     int diffhours = (int) (diff/(60 * 60 * 1000)); 
     System.out.println("difference between hours: " 
       + crunchifyFormatter.format(diffhours)); 
     int diffmin = (int) (diff/(60 * 1000)); 
     System.out.println("difference between minutes: " 
       + crunchifyFormatter.format(diffmin));*/ 
     int diffsec = (int) (diff/(1000)); 
     System.out.println("difference between seconds:" 
       + crunchifyFormatter.format(diffsec)); 
+0

kodunun yanına .... – Vela

2

Her ikisi de 32 bit & 64 bit ile uyumlu bir küçük değişiklik. NSInteger'u kullanarak, sistem otomatik olarak 32/64 bit üzerinde int veya long basing'e dönecektir.Eğer günler, haftalar, aylar, yıllar dönüştürmek aynı arada

NSInteger seconds = 10000; 
NSInteger remainder = seconds % 3600; 
NSInteger hours = seconds/3600; 
NSInteger minutes = remainder/60; 
NSInteger forSeconds = remainder % 60; 

-1

yapıyor deneyin:

x=int(input("enter a positive integer: ")) 
    sec = int(x % 60); 
    minu =int((x % 3600)/60); 
    ho =int((x % 86400)/3600); 
    days =int(x/(60 * 60 * 24)); 
    print(int(days),"days", ho,"hours", minu , "minutes" , sec ,"seconds") 
0

Toplamda gelen gün, saat, dakika ve saniye alacak saniye (self.secondsLeft)

days = self.secondsLeft/86400; 
hours = (self.secondsLeft %86400)/3600; 
minutes = (self.secondsLeft % 3600)/60; 
seconds = (self.secondsLeft %3600) % 60; 

Kod ......

[NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES]; 

-(void) updateCountdown { 

    int days,hours,minutes,seconds; 
    self.secondsLeft--; 

    days = self.secondsLeft/86400; 
    hours = (self.secondsLeft %86400)/3600; 
    minutes = (self.secondsLeft % 3600)/60; 
    seconds = (self.secondsLeft %3600) % 60; 

    NSLog(@"Time Remaining =%@",[NSString stringWithFormat:@"%02d:%02d:%02d:%02d",days, hours, minutes,seconds]); 
} 
1

Bu (sadece saniye toplam miktarını ve bunların her birinin arasında bir ilişki kullanılarak) saniye, dakika ve saat saniye dönüştürmek için zaman algoritması: burada

int S = totalSeconds % BaseSMH 

int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2)/BaseSMH 

int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2))/BaseSMH^2 

ve bunun zaman açıklama şu : ss: dd: SS = 02:20:10 => totalseconds = * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

2 taban

test süresi saniye dönüştürüldü arasında saniye -> dakikalar ve dakikalar -> saatler 60'tır (saniye cinsinden -> saat 60^2 = 3600'dür).

int totalSeconds = 8410 
const int BaseSMH = 60 

(burada bir değişken ile temsil edilir) Her bir birim

saniye toplam miktarı (saniye olarak ifade edilir), önceki kaldırma birimi saniye ve çalışıyoruz birimi arasındaki ilişki ile bölün hesaplanabilir hesaplamak. (Biz şimdi önceki birimi hesaplanmış ve her hesaplama sonra böyle nasıl görüneceğini ile dakikalar ve saatler hesaplamalarda her üniteyi yerine tüm matematik gibi

int S = totalSeconds % BaseSMH 

int M = ((totalSeconds - S) % BaseSMH^2)/BaseSMH 

int H = (totalSeconds - S - M * BaseSMH)/BaseSMH^2 

: Bu, her calulation bu algoritma kullanılarak neye benzediği M hesaplanmasında BaseSMH ile bölünmesi ve H calulation içinde BaseSMH ile çarparak) birbirini iptal unutmayın Bu gibi görünecektir yukarıdan

int S = totalSeconds % BaseSMH 

int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2)/BaseSMH 

int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH^2))/BaseSMH^2 

"totalseconds" ile test ve "BaseSMH":

int S = 8410 % 60 

int M = ((8410 - 8410 % 60) % 60^2)/60 

int H = (8410 - 8410 % 60 - ((8410 - 8410 % 60) % 60^2))/60^2 

hesaplanması S:

int S = 8410 % 60 = 10 

hesaplanması M:

int M = ((8410 - 8410 % 60) % 60^2)/60 
= ((8410 - 10) % 3600)/60 
= (8400 % 3600)/60 
= 1200/60 
= 20 

hesaplanması H:

int H = (8410 - 8410 % 60 - ((8410 - 8410 % 60) % 60^2))/60^2 
= (8410 - 10 - ((8410 - 10) % 3600))/3600 
= (8400 - (8400 % 3600))/3600 
= (8400 - 1200)/3600 
= 7200/3600 
= 2 

Bununla istediğiniz hangisi birim ekleyebilir, sadece ne hesaplamak gerekir ilişki saniyeler ve istediğiniz birim arasındadır. Umarım her adımın açıklamalarını anlıyorsundur. Değilse, sadece sor ve ben daha fazla açıklayabilirim.

İlgili konular