UIDatePicker中的最小和最大日期

61

我想从日期选择器中获取最小和最大日期,但最小日期应为当前日期的“-18”,最大日期应为当前日期的“-100”。

假设当前年份是2018,则我想要的最小日期为2000年,最大日期为1918年。

我目前所做的是:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [gregorian components:NSYearCalendarUnit fromDate:[NSDate date]];

NSInteger year = [components year];

int mindt = year - 18;

int maxdt = year -100;

   // NSDate * MinDate = [components year] - 18;

   // NSDate * MaxDate =  [components year] - 100;

   // self.datePicker.minimumDate = MinDate;

   // self.datePicker.maximumDate = MaxDate;

但我无法将这个整数转换为日期格式。


不清楚你想要实现什么。只需说明你想从日期选择器中显示或获取哪些年份即可。 - Damitha Raveendra
12个回答

87

试试这个:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:-18];
NSDate *minDate = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];
[comps setYear:-150];
NSDate *maxDate = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];
[comps release];

self.datePicker.minimumDate = minDate;
self.datePicker.maximumDate = maxDate;

它可以很容易地翻译为Swift 4.2:

    let calendar = Calendar(identifier: .gregorian)

    let currentDate = Date()
    var components = DateComponents()
    components.calendar = calendar

    components.year = -18
    components.month = 12
    let maxDate = calendar.date(byAdding: components, to: currentDate)!

    components.year = -150
    let minDate = calendar.date(byAdding: components, to: currentDate)!

    picker.minimumDate = minDate
    picker.maximumDate = maxDate

1
嘿@tilto,你的代码很棒,但它也显示了禁用日期,是否有可能隐藏它们? - Smit Saraiya
1
“Disabled date” 是什么意思? - tilo
1
@tilo...您好,如何更新日期选择器视图中的最小和最大日期范围。例如:配置UIDatePicker以仅显示从九月到三月的月份范围。 - Ron
@tilo "禁用日期" 意味着在日期选择器中不显示它们。 - ArgaPK
@tilo,我认为SmitSaraiya想表达的是,假设我们在二月份,并且这不是闰年,那么有没有办法从日期列表中隐藏29号,并且是否可以限制选择器不要跳转到任何未来的年份,而是保持当前设置的最大年份。 - Shiv Prakash
@tilo 假设我想设置components.year = 0 components.month = -6 let maxDate = calendar.date(byAdding: components, to: currentDate)!这样做对吗? - Muhammad Hasan Irshad

52

看这里的Swift版本。 使用负数减去,使用正数加上日期组件。

1. 设置最小日期

 yourDatePicker.minimumDate = Calendar.current.date(byAdding: .year, value: -1, to: Date())

2. 设定最大日期

 yourDatePicker.maximumDate = Calendar.current.date(byAdding: .year, value: 1, to: Date())

我想从今天的日期开始,我的结束日期将是2005年。那么我该如何编码呢? - Rana Ali Waseem
你的开始日期是: let startDate = Date() 和结束日期是: let currentYear = Calendar.current.component(.year, from: Date()) let endDate = Calendar.current.date(byAdding: .year, value:(2005 - currentYear), to: Date()) - Rahul Panzade
我正在使用这个库。但是,使用给定的解决方案无法实现我的目标。 - Rana Ali Waseem
这应该是被选中的答案。完美。精确并且能够胜任! - Junaid Mukhtar

22

Swift 5.1

extension UIDatePicker {
    func set18YearValidation() {
        let currentDate: Date = Date()
        var calendar: Calendar = Calendar(identifier: Calendar.Identifier.gregorian)
        calendar.timeZone = TimeZone(identifier: "UTC")!
        var components: DateComponents = DateComponents()
        components.calendar = calendar
        components.year = -18
        let maxDate: Date = calendar.date(byAdding: components, to: currentDate)!
        components.year = -150
        let minDate: Date = calendar.date(byAdding: components, to: currentDate)!
        self.minimumDate = minDate
        self.maximumDate = maxDate
    } }

太棒了,我真的能够得到我需要的有关简单组件的信息。谢谢。 - Rakshitha Muranga Rodrigo
太棒了,我实际上能找到我需要的关于简单组件的信息。谢谢。 - Rakshitha Muranga Rodrigo

16

这是2017年(Swift 3)中的样子

    var components = DateComponents()
    components.year = -100
    let minDate = Calendar.current.date(byAdding: components, to: Date())

    components.year = -18
    let maxDate = Calendar.current.date(byAdding: components, to: Date())

    datePicker.minimumDate = minDate
    datePicker.maximumDate = maxDate

15

Swift 2.1 中:

    let currentDate: NSDate = NSDate()

    let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    // let calendar: NSCalendar = NSCalendar.currentCalendar()
    calendar.timeZone = NSTimeZone(name: "UTC")!

    let components: NSDateComponents = NSDateComponents()
    components.calendar = calendar

    components.year = -18
    let minDate: NSDate = calendar.dateByAddingComponents(components, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))!

    components.year = -150
    let maxDate: NSDate = calendar.dateByAddingComponents(components, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))!

    self.dateOfBirthUIDatePicker.minimumDate = minDate
    self.dateOfBirthUIDatePicker.maximumDate = maxDate

    print("minDate: \(minDate)")
    print("maxDate: \(maxDate)")

2
应该互换minDate和maxDate。 - oOEric

8

Swift 3.0

 let gregorian: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
    let currentDate: Date = Date()
    let components: NSDateComponents = NSDateComponents()

    components.year = -150
    let minDate: Date = gregorian.date(byAdding: components as DateComponents, to: currentDate, options: NSCalendar.Options(rawValue: 0))!

    components.year = -16
    let maxDate: Date = gregorian.date(byAdding: components as DateComponents, to: currentDate, options: NSCalendar.Options(rawValue: 0))!

    self.datepicker.minimumDate = minDate
    self.datepicker.maximumDate = maxDate

哇,为什么要写let components: NSDateComponents = NSDateComponents()然后再写components as DateComponents这样很傻,直接写let components = DateComponents()就可以了。另外,你需要将components声明为var而不是let。 - HuXu7

3

UIDatePicker中的最小和最大日期:#Swift

如果你想在两个日期值之间选择最小和最大日期,请使用下面的简单代码:

例如:最小日期:2017年4月1日,最大日期:2018年3月31日

let calendar = Calendar.current
var minDateComponent = calendar.dateComponents([.day,.month,.year], from: Date())
minDateComponent.day = 01
minDateComponent.month = 04
minDateComponent.year = 2017

let minDate = calendar.date(from: minDateComponent)
print(" min date : \(String(describing: minDate))")

var maxDateComponent = calendar.dateComponents([.day,.month,.year], from: Date())
maxDateComponent.day = 0
maxDateComponent.month = 03 + 1
maxDateComponent.year = 2018

let maxDate = calendar.date(from: maxDateComponent)
print("max date : \(String(describing: maxDate))")

picker.minimumDate = minDate! as Date
picker.maximumDate =  maxDate! as Date

2

在Objective C中, NSDateComponents *comps = [[NSDateComponents alloc] init];

意思是创建一个NSDateComponents对象,并将其赋值给变量comps。
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];

NSInteger year = components.year;
NSInteger month = components.month;
NSInteger day = components.day;
NSInteger minimumYear = year - 1900;//Given some year here for example
NSInteger minimumMonth = month - 1;
NSInteger minimumDay = day - 1;
[comps setYear:-minimumYear];
[comps setMonth:-minimumMonth];
[comps setDay:-minimumDay];
NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];

[datePicker setMinimumDate:minDate];
[datePicker setMaximumDate:[NSDate date]];

最小日期应为1900年1月1日。希望这对大家有用.. :)

在Swift 2.0或更高版本中

    let calendar = NSCalendar(calendarIdentifier:NSCalendarIdentifierGregorian);

    let todayDate = NSDate()

    let components = calendar?.components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day], fromDate: todayDate)
    let minimumYear = (components?.year)! - 1900
    let minimumMonth = (components?.month)! - 1
    let minimumDay = (components?.day)! - 1

    let comps = NSDateComponents();
    comps.year = -minimumYear
    comps.month = -minimumMonth
    comps.day = -minimumDay

    let minDate = calendar?.dateByAddingComponents(comps, toDate: todayDate, options: NSCalendarOptions.init(rawValue: 0))

    datePicker.minimumDate = minDate
    datePicker.maximumDate = datePicker.date

嘿,comps(obj c)是什么意思? - Smit Saraiya

2

另一个情况:

假设我想展示出生日期作为日期选择器,DOB 的范围在 1980 年 1 月 1 日至 2000 年 1 月 1 日之间。

@IBOutlet var datePicker: UIDatePicker!

override func viewDidLoad() {
        super.viewDidLoad()        
        datePicker.datePickerMode = UIDatePickerMode.date       


        // 01/01/1980 to 01/01/2000

        let calendar = Calendar.current
        var minDateComponent = calendar.dateComponents([.day,.month,.year], from: Date())
        minDateComponent.day = 01
        minDateComponent.month = 01
        minDateComponent.year = 1980

        let minDate = calendar.date(from: minDateComponent)
        print(" min date : \(minDate)")

        var maxDateComponent = calendar.dateComponents([.day,.month,.year], from: Date())
       maxDateComponent.day = 01
        maxDateComponent.month = 01
        maxDateComponent.year = 2000

        let maxDate = calendar.date(from: maxDateComponent)
        print("max date : \(maxDate)")

        self.datePicker.minimumDate = minDate! as Date
        self.datePicker.maximumDate =  maxDate! as Date

}

1

Swift 4.0

UIDatePicker扩展

extension UIDatePicker {
    func set18YearValidation() {
        let currentDate: NSDate = NSDate()
        let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
        calendar.timeZone = NSTimeZone(name: "UTC")! as TimeZone
        let components: NSDateComponents = NSDateComponents()
        components.calendar = calendar as Calendar
        components.year = -18
        let maxDate: NSDate = calendar.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! as NSDate
        components.year = -150
        let minDate: NSDate = calendar.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! as NSDate
        self.minimumDate = minDate as Date
        self.maximumDate = maxDate as Date
    } }

1
你好,这段代码可以运行,但它并不是完全符合 Swift4 语法的。NS 是 Obj-C 时代的遗留物。在此我提供了正确版本的代码。 - swift2geek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接