【问题标题】:NSDate dateWithTimeIntervalSince1970 adding an extra day onNSDate dateWithTimeIntervalSince1970 添加额外的一天
【发布时间】:2016-05-03 16:56:28
【问题描述】:


我有一个方法可以更新标签并充当秒表。当我将字符串格式化为因子天时,它可以正常工作,它会增加额外的一天。

例如。如果秒表在十分钟前启动,标签将显示:
01:00:10:00
它应该只显示

00:00:10:00

    - (void)updateTimer
{
    NSDate *currentDate = [NSDate date];
    NSDate *dateValue=[[NSUserDefaults standardUserDefaults] objectForKey:@"pickStart"];

    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:dateValue];

    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];

    // Create a date formatter
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd:HH:mm:ss"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

    // Format the elapsed time and set it to the label
    NSString *timeString = [dateFormatter stringFromDate:timerDate];
    self.stopWatchLabel.text = timeString;

}

任何帮助将不胜感激。

【问题讨论】:

    标签: ios objective-c nsdate


    【解决方案1】:

    你所做的不合适。您的目标似乎是将timeInterval 转换为天、小时、分钟和秒。您使用timerDateNSDateFormatter 不是实现该目标的正确方法。

    timeInterval 不是 1970 年 1 月 1 日的偏移量,timeInterval 不代表日期。

    您应该做的是将currentDatedateValue 之间的区别作为一组NSDateComponents

    - (void)updateTimer {
        NSDate *currentDate = [NSDate date];
        NSDate *dateValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"pickStart"];
    
        unsigned int unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
        NSDateComponents *comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:dateValue  toDate:currentDate  options:0];
        int days = [comps day];
        int hours = [comps hours];
        int minutes = [comps minutes];
        int seconds = [comps seconds];
    
        NSString *timeString = [NSString stringWithFormat:@"%d:%02d:%02d:%02d", days, hours, minutes, seconds];
        self.stopWatchLabel.text = timeString;
    }
    

    【讨论】:

    • 感谢 rmaddy!我设法从您的解决方案中得到了最终答案。干得好
    【解决方案2】:

    没有“额外的一天”,您生成的“日期”是 1970 年 1 月 1 日之后的时间点,所以如果您的格式包括您至少获得 1...

    只需坚持使用 NSTimeInterval 值并使用 NSDateComponentsFormatter - 尽管有名称,它也会格式化时间间隔 - 或者只是自己算术以获取秒、分钟等并格式化。

    HTH

    【讨论】:

    • 当然你可以有 -10 分钟的时间间隔,你会得到 1969 年 12 月 31 日 23:50:00。
    • @gnasher729 - 当然 ;-) 我可能应该说“相对于”而不是“之后”,但我确实说“你生产”,所以它是正确的(当然是侥幸:-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2011-10-27
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多