Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDateComponents(通过MTDates)返回一个奇怪的小时数(mt_hourOfDay)_Ios_Objective C_Ios7_Nsdate_Nsdatecomponents - Fatal编程技术网

Ios NSDateComponents(通过MTDates)返回一个奇怪的小时数(mt_hourOfDay)

Ios NSDateComponents(通过MTDates)返回一个奇怪的小时数(mt_hourOfDay),ios,objective-c,ios7,nsdate,nsdatecomponents,Ios,Objective C,Ios7,Nsdate,Nsdatecomponents,我已经看了相关的问题和答案,他们的解决方案没有起作用。我真的被从NSDateComponents和NSDateFormatter(以及MTDates)接收到的输出弄糊涂了(为了便于使用,我尝试绕过它以获得不同的结果,但没有效果) 以下是UI相关部分的链接(来自模拟器): 以及与问题相关的日志: 2013-10-31 23:58:03.407 Application[22530:70b] Date 2013-11-01 04:58:03 +0000 2013-10-31 23:58:03.408

我已经看了相关的问题和答案,他们的解决方案没有起作用。我真的被从NSDateComponents和NSDateFormatter(以及MTDates)接收到的输出弄糊涂了(为了便于使用,我尝试绕过它以获得不同的结果,但没有效果)

以下是UI相关部分的链接(来自模拟器):

以及与问题相关的日志:

2013-10-31 23:58:03.407 Application[22530:70b] Date 2013-11-01 04:58:03 +0000
2013-10-31 23:58:03.408 Application[22530:70b] Formatted Date Oct 31, 2013, 11:58:03 PM
2013-10-31 23:58:03.408 Application[22530:70b] Hours 17
2013-10-31 23:58:03.408 Application[22530:70b] Minutes 9
用于获取数字的代码:

[NSDate mt_setTimeZone:[NSTimeZone localTimeZone]];
NSDate *current = [NSDate date];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];
[formatter setTimeZone:[NSTimeZone localTimeZone]];

NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[cal setTimeZone:[NSTimeZone localTimeZone]];
NSDateComponents *comp = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:current];

NSUInteger hours = comp.hour;
NSUInteger minutes = ceil([current mt_minuteOfHour] / 6);

NSLog(@"Date %@", current);
NSLog(@"Formatted Date %@", [formatter stringFromDate:current]);
NSLog(@"Hours %lx", hours);
NSLog(@"Minutes %lx", minutes);

self.dateLabel.text = [formatter stringFromDate:current];
self.timeLabel.text = [NSString stringWithFormat:@"%lx.%lx", hours, minutes];
我不知道你是否能从上面的输出中分辨出来,但是格式化的日期(对于正确的时区)将小时显示为“11”(“11:58:03”),这让我感到困惑,即使将
NSCalendar
NSDateFormatter
的时区设置为相同的
NSTimeZone
localTimeZone
)我也会得到“17”与当前时间相同

我还应该提到,我正在使用它来增加日期操作,但在我加入这个库之前遇到了这个问题(希望它的加入可能会使这些结果更加合理)。也就是说,我还尝试将获取自己组件的部分替换为:

NSUInteger hours = [current mt_hourOfDay];

不幸的是,这也返回“17”。我希望它会返回“23”,但会很高兴使用和“11”,然后可以将其转换为24刻度。

您正在使用格式说明符
%lx
,它将数字格式化为十六进制值。您希望
%ld
获得十进制(以10为基数)

有关一些基本格式说明符,请参见


有关
printf
样式格式说明符的完整列表,请参阅。Objective-C使用此规范,并为对象添加了
%@

格式说明符
%x
用于十六进制。使用
%d
表示十进制(以10为基数)。23十进制是17十六进制。@maddy哇。。。我现在觉得自己像个白痴还是怎么了。我对格式化组件的不熟悉以及文档中缺少规范(文档中的
nsuiger%lu或%lx
)导致我盲目地四处走动。我从来没有想到过这个想法。如果你不介意在回答中写上这句话(我知道这并不多),我会给你一个接受的机会。这是我问题的解决办法。有时是一些小事。:)看到我的答案了。在我发表初步评论后,我意识到他们在文档中包含了我完全忽略的十六进制格式的
%x
%x
,应该应用于
%lx
,谢谢你指出这一点。