尝试仅使用NSDate时间

时间:2013-05-04 08:14:21

标签: ios objective-c xcode nsdate nsdatecomponents

我很难找到一种方法来使用NSDate仅用于时间目的。 我试图做以下代码:

- (void)awakeFromInsert
{
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    comps.minute = 45;
    comps.second = 0;

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    self.periodDuration = [calendar dateFromComponents:comps];
    NSLog(@"periodDuration: %@",self.periodDuration);

    comps = [[NSDateComponents alloc] init];
    comps.hour = 8;
    comps.minute = 0;
    self.firstPeriodStartTime = [calendar dateFromComponents:comps];
    NSLog(@"firstPeriodTime: %@",self.periodDuration);
}

但我得到的结果是:

periodDuration: 0001-12-31 22:24:04 +0000
firstPeriodTime: 0001-12-31 22:24:04 +0000

我期待的结果:

periodDuration: 45:00
firstPeriodTime: 08:00

我做错了什么?我怎样才能解决这个问题? 谢谢。

4 个答案:

答案 0 :(得分:12)

日期日志会误导您,如果您只使用少量组件形成日期,则无法获得唯一标识日期和时间的正确日期实例。

如果您尝试使用此代码剪切,您可以发现,如果您只是将日期转换回字符串,它就像您期望的那样

NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.minute = 45;
comps.second = 0;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *periodDate = [calendar dateFromComponents:comps];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"mm:ss"];
NSLog(@"periodDuration: %@",[dateFormatter stringFromDate:periodDate]);

comps = [[NSDateComponents alloc] init];
comps.hour = 8;
comps.minute = 0;
NSDate *firstPeriodDate = [calendar dateFromComponents:comps];
[dateFormatter setDateFormat:@"HH:mm"];
NSLog(@"firstPeriodTime: %@",[dateFormatter stringFromDate:firstPeriodDate]);

periodDuration:45:00

firstPeriodTime:08:00

答案 1 :(得分:3)

您可以使用NSDateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];    
[dateFormatter setDateFormat:@"HH:mm"];
NSLog(@"%@",[dateFormatter stringFromDate:[NSDate date]]);

答案 2 :(得分:3)

使用NSTimeInterval(基本上是包含秒数的双精度型)。将其存储在CoreData

[NSNumber numberWithDouble:myTimeInterval];

格式化:如果您希望显示超过24小时,请使用:

NSUInteger seconds = (NSUInteger)round(myTimeInterval);
NSString *formattedDate = [NSString stringWithFormat:@"%02u:%02u:%02u",
                           seconds / 3600, (seconds / 60) % 60, seconds % 60];
NSLog(@"%@", formattedDate);

如果您不想超过24小时,可以再次使用NSDateNSDateFormatter

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:myTimeInterval];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSString *formattedDate = [dateFormatter stringFromDate:date];
NSLog(@"%@", formattedDate);

答案 3 :(得分:0)

NSString *timeString;
timeString = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                            dateStyle:NSDateFormatterNoStyle
                                            timeStyle:NSDateFormatterMediumStyle];

下午12:03:54