【发布时间】:2010-10-08 23:50:58
【问题描述】:
在objective-c中,如何将整数(表示秒)转换为天、分钟、小时?
谢谢!
【问题讨论】:
标签: objective-c time
在objective-c中,如何将整数(表示秒)转换为天、分钟、小时?
谢谢!
【问题讨论】:
标签: objective-c time
在这种情况下,你只需要分割。
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;
对于更复杂的日期计算,例如 1983 年 1 月 19 日下午 3 点之后的一千万秒内的天数,您可以使用 NSCalendar 类和 NSDateComponents。 Apple 的日期和时间编程指南在这里为您提供帮助。
【讨论】:
试试这个,
int forHours = seconds / 3600,
remainder = seconds % 3600,
forMinutes = remainder / 60,
forSeconds = remainder % 60;
您可以按照相同的程序使用它来获取更多详细信息,例如天、周、月和年
【讨论】:
我知道这是一篇旧帖子,但我还是想分享。以下代码是我使用的。
int seconds = (totalSeconds % 60);
int minutes = (totalSeconds % 3600) / 60;
int hours = (totalSeconds % 86400) / 3600;
int days = (totalSeconds % (86400 * 30)) / 86400;
第一行 - 我们得到的秒数除以一分钟的秒数。
第二行 - 我们得到除以一小时内的秒数后剩下的秒数。然后我们将其除以一分钟的秒数。
第三行 - 我们得到除以一天中的秒数后的剩余秒数。然后我们将它除以一小时的秒数。
第四行 - 我们得到秒除以一个月的秒数后的余数。然后我们将其除以一天中的秒数。 我们可以只使用以下几天...
int days = totalSeconds / 86400;
但是,如果我们使用上面的行并希望继续获得几个月,我们最终会得到 1 个月和 30 天,而我们只想获得 1 个月。
在 Xcode 中打开一个 Playground 并尝试一下。
【讨论】:
objective-c 中最受欢迎的方法可能是这种方法,正如 Apple 在他们的文档中推荐的那样。
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);
确保不要检索未使用 unitFlags 定义的组件,整数将是“未定义”。
【讨论】:
startDate 和 endDate 之间的东西不会中断?
使用内置函数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;
}
【讨论】:
只需稍作修改即可兼容 32 位和 64 位。使用NSInteger系统会根据32/64位自动转换为int或long。
NSInteger seconds = 10000;
NSInteger remainder = seconds % 3600;
NSInteger hours = seconds / 3600;
NSInteger minutes = remainder / 60;
NSInteger forSeconds = remainder % 60;
通过同样的方式,您可以转换为天、周、月、年
【讨论】:
这是我将秒转换为秒、分钟和小时的算法(仅使用总秒数和它们之间的关系):
int S = totalSeconds % BaseSMH
int M = ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH ^ 2) / BaseSMH
int H = (totalSeconds - totalSeconds % BaseSMH - ((totalSeconds - totalSeconds % BaseSMH) % BaseSMH ^ 2)) / BaseSMH ^ 2
下面是我的解释:
测试时间转换为秒: HH:MM:SS = 02:20:10 => totalSeconds = 2 * 3600 + 20 * 60 + 10 = 7200 + 1200 + 10 = 8410
秒 -> 分钟和分钟 -> 小时之间的基数是 60(从秒 -> 小时是 60 ^ 2 = 3600)。
int totalSeconds = 8410
const int BaseSMH = 60
每个单位(这里由一个变量表示)可以通过从总秒数中删除前一个单位(以秒表示)并将其除以秒与我们试图计算的单位之间的关系来计算。这是使用此算法的每次计算的样子:
int S = totalSeconds % BaseSMH
int M = ((totalSeconds - S) % BaseSMH ^ 2) / BaseSMH
int H = (totalSeconds - S - M * BaseSMH) / BaseSMH ^ 2
与所有数学一样,我们现在可以将分钟和小时计算中的每个单位替换为我们计算前一个单位的方式,然后每个计算将如下所示(请记住,在 M 计算中除以 BaseSMH,在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
使用上面的“totalSeconds”和“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
计算 S:
int S = 8410 % 60 = 10
计算 M:
int M = ((8410 - 8410 % 60) % 60 ^ 2) / 60
= ((8410 - 10) % 3600) / 60
= (8400 % 3600) / 60
= 1200 / 60
= 20
计算高度:
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
有了这个,你可以添加你想要的任何单位,你只需要计算秒和你想要的单位之间的关系。希望你能理解我对每一步的解释。如果没有,请询问,我可以进一步解释。
【讨论】:
最初我想出了一个类似于鱼的答案的解决方案:
const secondsToString = s => {
const secondsOfYear = 60 * 60 * 24 * 365;
const secondsOfDay = 60 * 60 * 24;
const secondsOfHour = 60 * 60;
const secondsOfMinute = 60;
let y = ~~(s / secondsOfYear); s %= secondsOfYear;
let d = ~~(s / secondsOfDay); s %= secondsOfDay;
let h = ~~(s / secondsOfHour); s %= secondsOfHour;
let m = ~~(s / secondsOfMinute); s %= secondsOfMinute;
y = (y > 0 ? (y + 'y ') : '');
d = (d > 0 ? (d + 'd ') : '');
h = (h > 0 ? (h + 'h ') : '');
m = (m > 0 ? (m + 'm ') : '');
s = (s > 0 ? (s + 's ') : '');
return y + d + h + m + s;
}
我注意到它可以用数组map() 和reduce() 函数泛化,因为它包含一些迭代和递归。
const intervalToLevels = (interval, levels) => {
const cbFun = (d, c) => {
let bb = d[1] % c[0],
aa = (d[1] - bb) / c[0];
aa = aa > 0 ? aa + c[1] : '';
return [d[0] + aa, bb];
};
let rslt = levels.scale.map((d, i, a) => a.slice(i).reduce((d, c) => d * c))
.map((d, i) => ([d, levels.units[i]]))
.reduce(cbFun, ['', interval]);
return rslt[0];
};
const TimeLevels = {
scale: [365, 24, 60, 60, 1],
units: ['y ', 'd ', 'h ', 'm ', 's ']
};
const secondsToString = interval => intervalToLevels(interval, TimeLevels);
您可以轻松地将函数intervalToLevels() 扩展到其他测量级别,例如液体质量、长度等。
const LengthLevels = {
scale: [1760, 3, 12, 1],
units: ['mi ', 'yd ', 'ft ', 'in ']
};
const inchesToString = interval => intervalToLevels(interval, LengthLevels);
const LiquidsLevels = {
scale: [4, 2, 2, 8, 1],
units: ['gal ', 'qt ', 'pt ', 'cup ', 'fl_oz ']
};
const ouncesToString = interval => intervalToLevels(interval, LiquidsLevels);
【讨论】:
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));
【讨论】:
您将从总秒数(self.secondsLeft)中获得天、小时、分钟和秒
days = self.secondsLeft/86400;
hours = (self.secondsLeft %86400)/3600;
minutes = (self.secondsLeft % 3600) / 60;
seconds = (self.secondsLeft %3600) % 60;
代码 ......
[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]);
}
【讨论】:
尝试执行以下操作:
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" )
【讨论】: