gpt4 book ai didi

iphone - NSDateComponents 因 2 个日期的差异而缺少 1 秒

转载 作者:行者123 更新时间:2023-12-03 20:08:14 24 4
gpt4 key购买 nike

遇到一个非常令人沮丧的问题,似乎没有任何意义。我正在尝试获取两个日期之间的年数。这是我的代码。

// Initialize variable to store calendar
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

// Break out date to year component
NSDateComponents *Components = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit
fromDate:startDate
toDate:endDate
options:0];

// Debugging code
NSLog(@"Debug start date = %@",startDate);
NSLog(@"Debug end date = %@", endDate);
NSLog(@"Debug year = %d",[Components year]);
NSLog(@"Debug month = %d",[Components month]);
NSLog(@"Debug day = %d", [Components day]);
NSLog(@"Debug hours = %d",[Components hour]);
NSLog(@"Debug minutes = %d", [Components minute]);
NSLog(@"Debug seconds = %d", [Components second]);

[gregorian release];

// Check which component to extract and return value accordingly
// Defaults to month for now
if ([datecomponent isEqualToString:@"year"]) {
return [Components year];
}
else {
return [Components month];
}

开始和结束日期由 UIDatePickers 在其他地方设置。他们默认相差10岁。一旦我返回到控制结束日期的 UIDatePicker 并将其提前 1 年。问题将开始出现。这是将结束日期移回原始日期后我将看到的 NSLog 示例。我应该在其他地方看到 10 年和 0,但我错过了 1 秒。

Debug start date = 2011-08-15 15:55:07 +0000
Debug end date = 2021-08-15 15:55:07 +0000
Debug year = 9
Debug month = 11
Debug day = 30
Debug hours = 23
Debug minutes = 59
Debug seconds = 59

对我来说,开始日期和结束日期在 10 年之间看起来是相同的,但由于某种原因,我错过了 1 秒的时间。有谁知道为什么吗?

提前致谢!

已添加

这是我初始化和存储 2 个日期的方式。

开始日期位于 viewWillAppear 方法中。

- (void)viewWillAppear:(BOOL)animated {
if ([managedObject valueForKeyPath:self.keypath] != nil)
[self.datePicker setDate:[managedObject
valueForKeyPath:keypath] animated:YES];
else
[self.datePicker setDate:[NSDate date] animated:YES];
[self.tableView reloadData];

[super viewWillAppear:animated];

}

同一个类也用于我的结束日期,但是我还在 NSManagedObject 的自定义子类中添加了以下代码:-

- (void)awakeFromInsert {
[super awakeFromInsert];

// Set default date of registration to be today's date
self.startdate = [NSDate date];

NSDate *today = [[NSDate alloc] init]; // I also tried to equate this to self.startdate but there is no difference
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setYear:10];
self.enddate = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0];

}

这会引起任何问题吗?如果是,为什么调试会显示开始和结束日期(包括它们的时间)完全相同?

最佳答案

我在一个 ViewController 中创建了一个带有两个 UIDatePicker 的简单项目。我将每个 UIDatePicker 初始化为引用日期,并设置一个操作方法来计算两个 UIDatePicker 每次更改时的日期之间的差异。我将你的代码插入到该方法中,然后在 iPhone 模拟器中对其进行了测试。结果是您的代码输出正好 10 年:

2011-08-15 11:18:44.225 test[1004:b303] Debug start date = 2001-01-01 00:00:00 +0000
2011-08-15 11:18:44.225 test[1004:b303] Debug end date = 2011-01-01 00:00:00 +0000
2011-08-15 11:18:44.226 test[1004:b303] Debug year = 10
2011-08-15 11:18:44.226 test[1004:b303] Debug month = 0
2011-08-15 11:18:44.227 test[1004:b303] Debug day = 0
2011-08-15 11:18:44.227 test[1004:b303] Debug hours = 0
2011-08-15 11:18:44.227 test[1004:b303] Debug minutes = 0
2011-08-15 11:18:44.228 test[1004:b303] Debug seconds = 0

在使用 UIDatePickers 之前,您是否将它们初始化为相同的时间?默认情况下,UIDatePickers 会初始化为其创建时的日期(这包括小时、分钟、秒等,即使您仅在选择器中显示年、月和日)。

您是否有可能以其他方式引入这种差异?也许您正在对日期进行一些其他计算或操作?

编辑:

在您添加的代码中,您应该从开始日期引用结束日期,而不是从另一个日期对象引用结束日期。我知道您说过这没有什么区别,但使用 startdate 是更好的形式,而不是假设今天和 startdate 将具有相同的值。

要考虑的另一件事是您的 setStartDate:setEndDate: 方法。在这些 setter 方法中,我建议将不需要的任何精度舍入到 0。如果您不允许用户设置比日期更精确的任何内容,则将任何更高的精度设置为 0。这样,任何两个日期之间就不会剩下任何小时、分钟或秒。

关于iphone - NSDateComponents 因 2 个日期的差异而缺少 1 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7068196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com