Ios 尝试将NSDate仅用于时间

Ios 尝试将NSDate仅用于时间,ios,objective-c,xcode,nsdate,nsdatecomponents,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:

我正在努力寻找一种方法,将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
我做错了什么?我怎样才能解决这个问题?
谢谢。

您可以使用
NSDateFormatter

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

使用
NSTimeInterval
(基本上是一个包含秒数的双精度值)。要将其存储在
核心数据中

[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小时,可以再次使用
NSDate
NSDateFormatter

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

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

如果您尝试剪掉这段代码,您会发现,如果您只是将日期转换回字符串,它正是您所期望的

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]);
时段持续时间:45:00

第一时段时间:08:00

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

12:03:54 PM

我知道这一点,但我认为用NSDate存储时间不是正确的选择。我不想用字符串表示日期。我想把它存储在核心数据中。。。NSLog只是想看看一切是否正常。我现在觉得自己很傻。。。我不敢相信我的问题是没有使用NSDateFormatter。不管怎样,现在我有了你的方法和@Andreas_Ley方法。你认为实施什么更好?将时间节省为秒或NSDate对象(使用核心数据)?@NoamSolovechick这是您的决定。因为coredata支持存储数据,所以您可以直接存储数据,而不需要任何模糊。这非常混乱。不要使用魔法数字,句号。一天不一定有24小时,一年也不一定有365天。@Pavan虽然我同意你的观点,但我不明白你为什么认为这是一个问题。OPs问题的一部分是如何在CoreData中存储时间间隔,我仍然认为使用NSTimeInterval是最好的方法。