2009-02-21 37 views

Trả lời

41

Trong trường hợp này, bạn chỉ cần chia nhỏ.

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; 

Đối với các tính toán ngày phức tạp hơn, chẳng hạn như số ngày trong mười triệu giây sau 15:00 vào ngày 19 tháng một năm 1983, bạn sẽ sử dụng lớp NSCalendar cùng với NSDateComponents. Hướng dẫn lập trình ngày và giờ của Apple giúp bạn ở đây.

+0

Cảm ơn bạn. Tôi đã hy vọng sẽ có một số phương pháp được xây dựng trong, tuy nhiên. – higginbotham

+0

@higginbotham - Bạn nên đánh dấu câu trả lời này là chính xác nếu nó giúp bạn. – Moshe

32

thử này,

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

và bạn có thể sử dụng nó để biết thêm chi tiết như ngày, tuần, tháng, và năm bằng cách làm theo các thủ tục tương tự

+2

Đây là cách gọn gàng hơn và súc tích hơn. –

+0

Phương pháp tốt.nếu giây không phải là một loại số nguyên thì chúng tôi không thể thực hiện các thao tác như ** remainder = seconds% 3600 **. – Gangadhar

+0

Câu hỏi thực sự đề cập đến nó là một số nguyên. –

3

Sử dụng được xây dựng trong chức năng strftime() :

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

Cách ưa thích nhất trong mục tiêu-c có thể là cách này, theo khuyến cáo của Apple trong tài liệu của họ.

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); 

Đảm bảo không truy xuất các thành phần không được xác định với đơn vị Thẻ, số nguyên sẽ là "không xác định".

+0

sẽ không phá vỡ nếu việc tính toán được thực hiện sao cho DTS hoặc bất kỳ điều gì rơi vào giữa 'startDate' và' endDate'? –

7

Tôi biết đây là một bài đăng cũ nhưng tôi vẫn muốn chia sẻ. Mã sau đây là những gì tôi sử dụng.

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

Dòng đầu tiên - Chúng tôi nhận được phần còn lại của giây khi chia cho số giây trong một phút.

Dòng thứ hai - Chúng tôi nhận được số giây còn lại sau khi chia cho số giây trong một giờ. Sau đó, chúng tôi chia nó theo giây trong một phút.

Dòng thứ ba - Chúng tôi nhận được số giây còn lại sau khi chia cho số giây trong một ngày. Sau đó, chúng tôi chia cho số giây trong một giờ.

Dòng thứ tư - Chúng tôi nhận được phần còn lại của giây sau khi chia cho số giây trong một tháng. Sau đó, chúng tôi chia cho số giây trong một ngày. Chúng tôi chỉ có thể sử dụng sau đây dành cho Days ...

int days = totalSeconds/86400; 

Nhưng nếu chúng ta sử dụng các dòng ở trên và muốn tiếp tục và nhận được tháng chúng ta sẽ kết thúc với 1 tháng và 30 ngày khi chúng tôi muốn để có được chỉ 1 tháng.

Mở Playground trong Xcode và dùng thử.

+2

đây là câu trả lời hay nhất – 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

bỏ ẩn mã .... – Vela

2

Chỉ cần sửa đổi chút cho cả hai tương thích với 32 bit & 64 bit. Sử dụng NSInteger hệ thống sẽ tự động chuyển đổi thành int hoặc dài dựa trên 32/64 bit.

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

Bằng cách tương tự, bạn có thể chuyển đổi sang ngày, tuần, tháng, năm

-1

Hãy thử làm như sau:

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

Bạn sẽ nhận được ngày, giờ, phút và giây từ tổng giây (self.secondsLeft)

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

Mã ......

[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

Đây là thuật toán của tôi để chuyển đổi giây đến giây, phút và giờ (chỉ sử dụng tổng số giây và mối quan hệ giữa mỗi người trong số họ):

int S = totalSeconds % BaseSMH 

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

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

Và đây sau lời giải thích của tôi về nó :

Kiểm tra thời gian chuyển đổi sang giây: HH: MM: SS = 02:20:10 => totalSeconds = 2 * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410

Các cơ sở giữa giây -> phút và phút -> giờ là 60 (từ giây -> giờ là 60^2 = 3600).

int totalSeconds = 8410 
const int BaseSMH = 60 

Mỗi đơn vị (ở đây đại diện bởi một biến) có thể được tính bằng cách loại bỏ các đơn vị trước đó (tính bằng giây) từ tổng số tiền của giây và chia nó cho mối quan hệ của nó giữa giây và đơn vị chúng tôi đang cố gắng tính toán. Đây là những gì mỗi calulation trông giống như sử dụng thuật toán này:

int S = totalSeconds % BaseSMH 

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

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

Như với tất cả toán học bây giờ chúng tôi có thể thay thế mỗi đơn vị trong phút và giờ tính toán với cách chúng tôi tính toán đơn vị trước đó và mỗi tính sau đó sẽ giống như thế này (hãy nhớ rằng chia với BaseSMH trong tính toán M và nhân với BaseSMH trong calulation H hủy lẫn nhau):

int S = totalSeconds % BaseSMH 

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

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

Testing với "totalSeconds" và "BaseSMH" từ trên sẽ giống như thế này:

int S = 8410 % 60 

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

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

Tính S:

int S = 8410 % 60 = 10 

Tính M:

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

Tính 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 

Với điều này bạn có thể thêm bất cứ đơn vị bạn muốn, bạn chỉ cần phải tính toán những gì mối quan hệ là giữa giây và đơn vị bạn muốn. Hy vọng bạn hiểu những lời giải thích của tôi về từng bước. Nếu không, chỉ cần hỏi và tôi có thể giải thích thêm.

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