NSDate dateWithTimeIntervalSince1970 添加额外的一天
NSDate dateWithTimeIntervalSince1970 adding an extra day on
我有一个更新标签并充当秒表的方法。当我将字符串格式化为考虑天数时,它可以正常接受,它会增加额外的一天。
例如。如果秒表在十分钟前启动,标签将显示:
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;
}
如有任何帮助,我们将不胜感激。
你这样做是不合适的。您的目标似乎是将 timeInterval
转换为天、小时、分钟和秒。您使用 timerDate
和 NSDateFormatter
不是实现该目标的正确方法。
timeInterval
不是 1970 年 1 月 1 日的偏移量,timeInterval
不代表日期。
你应该做的是将 currentDate
和 dateValue
之间的差异作为一组 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;
}
没有"additional day",你产生的"date"是1970年1月1日之后的一个时间点,所以如果你的格式包括那一天你至少得到一个1...
只需使用 NSTimeInterval
值并使用 NSDateComponentsFormatter
- 尽管有名称,它也会格式化时间间隔 - 或者自己做数学运算以获得秒,分钟等并格式化它们.
HTH
我有一个更新标签并充当秒表的方法。当我将字符串格式化为考虑天数时,它可以正常接受,它会增加额外的一天。
例如。如果秒表在十分钟前启动,标签将显示:
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;
}
如有任何帮助,我们将不胜感激。
你这样做是不合适的。您的目标似乎是将 timeInterval
转换为天、小时、分钟和秒。您使用 timerDate
和 NSDateFormatter
不是实现该目标的正确方法。
timeInterval
不是 1970 年 1 月 1 日的偏移量,timeInterval
不代表日期。
你应该做的是将 currentDate
和 dateValue
之间的差异作为一组 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;
}
没有"additional day",你产生的"date"是1970年1月1日之后的一个时间点,所以如果你的格式包括那一天你至少得到一个1...
只需使用 NSTimeInterval
值并使用 NSDateComponentsFormatter
- 尽管有名称,它也会格式化时间间隔 - 或者自己做数学运算以获得秒,分钟等并格式化它们.
HTH