我用相应的问题查看答案,他们的解决方案没有奏效。我真的很困惑我从NSDateComponents和NSDateFormatter收到的输出(以及MTDates的易用性,但我试图绕过它以获得不同的结果但无济于事。)
以下是用户界面相关部分的链接(来自模拟器):http://grab.by/rFbQ
以及与问题相关的日志:
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”作为当前小时。
我还应该提到我正在使用MTDates来扩充日期操作,但是在我包含这个库之前遇到了这个问题(希望它的包含可能会以某种方式使这些结果更加清晰)。话虽如此,我还尝试用以下方式替换我获取自己组件的部分:
NSUInteger hours = [current mt_hourOfDay];
不幸的是,这也会返回“17”。我希望它会返回“23”,但会对“11”感到满意,然后可以将其转换为24级。
答案 0 :(得分:1)
您正在使用格式说明符%lx
,它会将数字格式化为十六进制值。您希望%ld
获得小数(基数为10)。
有关基本格式说明符,请参阅String Programming Guide。
有关printf
样式格式说明符的完整列表,请参阅IEEE spec。 Objective-C使用此规范为对象添加%@
。