【问题标题】:NSComparisonResult OrderedDescending and OrderedAscending not functioning as expectedNSComparisonResult OrderedDescending 和 OrderedAscending 未按预期运行
【发布时间】:2015-04-17 23:52:04
【问题描述】:

我的意图是让每个日期从"1927-2-2" 到"1928-1-22" 在输入到 UIDatePicker 时调用一个图像。我可以成功调用除“1928-1-22”以外的每个日期的图像,这是唯一不产生图像的日期。有人可以帮忙吗?

import UIKit



class ViewController: UIViewController {


@IBOutlet weak var displayAnimal: UIImageView!

@IBOutlet weak var dateWheel: UIDatePicker!

@IBAction func goButton(sender: UIDatePicker)

    {

        let dateStringFormatter = NSDateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")

        let rabbit1A = dateStringFormatter.dateFromString("1927-2-2")
        let rabbit2A = dateStringFormatter.dateFromString("1928-1-22")

        println(dateWheel.date)
   if((dateWheel.date.compare(rabbit1A!) == NSComparisonResult.OrderedDescending || dateWheel.date.compare(rabbit1A!) == NSComparisonResult.OrderedSame)
 && (dateWheel.date.compare(rabbit2A!) == NSComparisonResult.OrderedAscending || dateWheel.date.compare(rabbit2A!) == NSComparisonResult.OrderedSame))
        {
        // set the image of UIImageView
        displayAnimal.image = UIImage(named: "rabbit")
        }

【问题讨论】:

    标签: ios swift uiimageview nsdate uidatepicker


    【解决方案1】:

    如果您的 dateWheel 仅显示日期,则 dateWheel.date 返回与您看到的日期和当时的本地时间相对应的 NSDateTime。

    而您的 dateStringFormatter 与 dateFormat "yyyy-MM-dd" 将在 00h:00m:000s 返回相同日期的 NSDate(如果您未指定时区,则为当地时间)。

    因此 dateWheelDate 可能晚于您的 rabbit2A。

    例如:您的当地时间是 14h:30:000,您在轮盘中选择 1928-1-22。你会得到一个日期 1928-1-22 14:30:000。

    在另一边,你的 rabbit2A = 1928-1-22 00:00:000。所以你的比较逻辑不起作用。

    要解决此问题,您可以使用 NSCalendar 将这两个日期与 .CalendarUnitDay 选项进行比较

    let date = dateWheel.date
    let rabbit2A = dateStringFormatter.dateFromString("1928-1-22")
    
    let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    
    let result = cal.compareDate(date, toDate: rabbit2A!, toUnitGranularity: NSCalendarUnit.CalendarUnitDay)
    

    注意 println(): 而 UIDatePicker 和 DateFormatter 默认使用本地时区,println() 显示原始值(作为 GMT 时间)。

    另外,你可以替换

    dateWheel.date.compare(rabbit2A!) == NSComparisonResult.OrderedAscending || dateWheel.date.compare(rabbit2A!) == NSComparisonResult.OrderedSame))
    

    由

    dateWheel.date.compare(rabbit2A!) != NSComparisonResult.OrderedDescending //or even .OrderedDescending 
    

    【讨论】:

    • 你会建议我将rabbit2A和rabbit1A改写成那个吗?如果我有 10 种兔子前任的变种,这也行。兔子1B,兔子2B。 rabbit1C rabbit2C....
    • 您可能想为 NSDate "sameDayAs" 编写一个扩展,使用上面的代码来查看日期是否在同一天。然后,您可以使用该方法进行所有比较。
    • 我将其添加到代码中,但问题仍然存在。我什至创建了一个全新的项目,但问题仍然存在。
    • 您不必创建新项目,尝试使用相同的日期格式化程序显示您的 datePicker.date & rabbit1A, rabbit2A 的值(使用“yyyy-MM-dd HH:mm:sss”也显示时间。
    • 好的,所以它很奇怪,但我让它工作了。 let rabbit1A = dateStringFormatter.dateFromString("1927-2-2 00:00:000") let rabbit2A = dateStringFormatter.dateFromString("1928-1-22 13:30:000") 你能帮我理解为什么这个工作 13:30 只是我选择的一个随机时间。而且我不得不将rabbitA1留空,否则我将无法在那个日期获得图像。
    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2020-06-28
    • 2012-02-18
    • 2018-01-18
    • 2012-06-14
    • 2019-03-03
    相关资源
    最近更新 更多