13

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

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

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

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];
4

9 回答 9

13

只需添加一行代码来设置您的时区。

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

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

于 2016-11-09T16:09:50.617 回答
6

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

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

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

于 2014-10-30T13:08:11.163 回答
5

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

于 2013-01-07T17:21:34.657 回答
5

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

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

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


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


还尝试在第一时间在选择器上设置时区属性,并为其分配一个手动实例化的公历。

于 2013-01-07T17:46:02.880 回答
1

我遇到了同样的麻烦,这就是我得出的结论:

如果您想为您的系统提供正确的表示,请不要使用 [date description] 来检查 NSDate。使用 NSDateFormatter,因为它根据您的系统偏好显示日期(在模拟器中它将是模拟器偏好)。

例如:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterNoStyle];
NSLog(@"date for locale is %@", [df stringFromDate:date]);
于 2013-03-31T10:11:24.107 回答
1

试试这个,

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.string(from: yourPicker.date)
于 2020-11-03T07:38:14.863 回答
0

可能是由于时区...

设置您的时区。

于 2013-01-07T17:15:09.420 回答
-1
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];
    }
}
于 2013-06-23T11:34:30.913 回答
-2

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

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

于 2019-06-13T05:01:45.067 回答