我的UIDatePicker
mm / dd / yy。它工作正常,但有一个问题:我将minimum
和maximum
日期设置为它,当用户尝试选择禁止的日期,月份或年份时,[datePicker date]
属性开始工作错误。它会返回current day - 1
或current month - 1
或current 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];
答案 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)