UIDatePicker返回错误的日期(实际日期为-1天)

时间:2013-01-07 17:11:44

标签: ios objective-c cocoa-touch uidatepicker

我的UIDatePicker mm / dd / yy。它工作正常,但有一个问题:我将minimummaximum日期设置为它,当用户尝试选择禁止的日期,月份或年份时,[datePicker date]属性开始工作错误。它会返回current day - 1current month - 1current year - 1。我添加了一些图片,所以你可以看到情况。

Correct date 这是正确的
wrong date 这是错误的(选择禁止日期后)

有人知道,我该如何解决这个问题?谢谢!

UPD: 代码

[self.myDatePicker setMinimumDate:[NSDate date]];
[self.myDatePicker setMaximumDate:[[NSDate date] addTimeInterval:2 * 365.25 * 24 * 60 * 60]]; // to get upto 5 years
NSDate * now = [[NSDate alloc] init];
[self.myDatePicker setDate: now animated: YES];

self.myDatePicker.timeZone = [NSTimeZone localTimeZone];
self.myDatePicker.calendar = [NSCalendar currentCalendar];

9 个答案:

答案 0 :(得分:6)

我的解决方案是将返回日期设置为12:00 AM,因为NSDates工作在UTC

NSDate * adjustedDate = [[NSCalendar currentCalendar] dateBySettingHour:12 minute:0 second:0 ofDate:sender.date options:0];

同样,对于日期计算,您应使用NSCalender方法,而不是addTimeInterval

答案 1 :(得分:5)

检查是否使用大字母的错误格式符号:“YYYY”。 用“yyyy”替换它们。

答案 2 :(得分:5)

它与时区和/或夏令时非常相似。但它必须非常微妙,因为代码看起来很好(在间隔旁边)。现在我的问题是你是否在俄罗斯:

今年克里姆林宫做了几次来回晃动,永远保持夏令时。其实我不确定,他们最后决定了什么。但也许它在Cocoa中没有得到正确反映。视频WWDC 2011 Video "Session 117 - Performing Calendar Calculations",主持人甚至提到这样的事情可能会发生。

请尝试使用手动设置时间到中午的日期,因为这可以让您远离这种混乱。


世界刚刚在iOS 6中发现了类似的不当行为:DND-Always-Active错误。我敢打赌这是错误的日期格式(YYYY而不是yyyy


还要尝试在拾取器上设置timezone属性,并为其分配一个手动实例化的公历。

答案 3 :(得分:4)

只需添加一行代码即可设置时区。

self.datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

0代表GMT 00。根据您的时区添加。

答案 4 :(得分:1)

我遇到了同样的麻烦,这就是我的结果:

如果要为系统正确表示,请不要使用[日期说明]检查NSDate。使用NSDateFormatter,因为它根据您的系统首选项显示日期(在模拟器中它将是模拟器首选项)。

例如:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterNoStyle];
NSLog(@"date for locale is %@", [df stringFromDate:date]);

答案 5 :(得分:0)

可能是由于TimeZone ......

设置您的时区。

答案 6 :(得分:0)

Boolean futureevent;
- (void)viewDidLoad
{
 futureevent = false;
}

int intervall = (int) [currentdate timeIntervalSinceDate: datePicker.date] / 60;

if (intervall < 1200 && intervall > 0)
{
    futureevent = true;
    NSDate *newDate1 = [datePicker.date dateByAddingTimeInterval:60*60*24*1];
    birthdate = [newDate1.description substringToIndex:spaceRange.location];
}
else
{
    if (futureevent)
    {
        NSDate *newDate1 = [datePicker.date dateByAddingTimeInterval:60*60*24*1];
        birthdate = [newDate1.description substringToIndex:spaceRange.location];
    }
    else
    {
        birthdate = [datePicker.date.description substringToIndex:spaceRange.location];
    }
}

答案 7 :(得分:0)

它不会返回错误的日期。实际发生的是,当您选择一个所谓的禁止日期时,日期选择器会在一天的第一时刻(即12:00 AM)重置为最大或最小允许日期。

因此,例如,如果您所在的时区比格林尼治标准时间早2个小时,则日期选择器返回的日期将是格林尼治标准时间昨天的10:00 PM。因此,在这里,您可能会认为它返回的是昨天的日期,但是如果将其转换为您的时区,则只会得到今天的日期,但是时间部分将是12:00 AM。

答案 8 :(得分:0)

尝试一下,

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.string(from: yourPicker.date)