【问题标题】:Trying to use NSDate for time only尝试仅在一段时间内使用 NSDate
【发布时间】:2013-04-28 15:17:10
【问题描述】:

我正在努力寻找一种仅将 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

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

【问题讨论】:

    标签: ios objective-c xcode nsdate nsdatecomponents


    【解决方案1】:

    日期日志会误导您,如果您正在形成一个只有几个组件的日期,您将无法获得唯一标识日期和时间的正确日期实例。

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

    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

    firstPeriodTime:08:00

    【讨论】:

    • 我现在觉得自己很白痴...我不敢相信我的问题不是使用 NSDateFormatter。无论如何,现在我有了你的方法和@Andreas_Ley 方法。您认为实施起来会更好吗?将时间保存为秒或 NSDate 对象(使用核心数据)?
    • @NoamSolovechick 这是你的决定。由于 coredata 支持这样存储日期,所以您可以直接存储它而无需任何麻烦。
    【解决方案2】:

    您可以使用NSDateFormatter

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

    【讨论】:

    • 我知道,但我认为这不是在 NSDate 中存储时间的正确选择。我不想在字符串中表示日期。我想把它存储在Core Data中...... NSLog只是为了看看是否一切都好。
    【解决方案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);
    

    【讨论】:

    • 这很乱。不要使用幻数,句号。一天不一定有 24 小时,一年也不一定有 365 天。
    • @Pavan 虽然我同意你的观点,但我不明白你为什么认为在这种情况下这是一个问题。 OP 的部分问题是如何在 CoreData 中存储时间间隔,我仍然相信使用 NSTimeInterval 是最好的方法。
    【解决方案4】:
    NSString *timeString;
    timeString = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                                dateStyle:NSDateFormatterNoStyle
                                                timeStyle:NSDateFormatterMediumStyle];
    

    下午 12:03:54

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多