【问题标题】:setting date manually to date picker returns one date always手动将日期设置为日期选择器总是返回一个日期
【发布时间】:2023-03-29 18:48:01
【问题描述】:

我从服务器而不是设备日期获取我的日期。但是更改日期有问题

override func viewDidAppear(_ animated: Bool) {
        datepicker2.datePickerMode = .date
        datepicker2.timeZone = TimeZone(identifier: "IRST")
        datepicker2.calendar = Calendar(identifier: .persian)
        datepicker2.locale = Locale(identifier: "fa_IR")
        datepicker2.date=self.minDate // this is a date var filled
        datepicker2.addTarget(self, action: #selector(datepickerAction(_:)), for: .valueChanged)
}

每次更改日期只会打印一个日期

func datepickerAction(_ sender: UIDatePicker){

     let date = self.datepicker2.date

let components = Calendar.current.dateComponents([.month, .day,.year], from: date)
let hour = components.month
let minute = components.day
    let yr=components.year
    print(hour,minute,yr) // prints one date always
}

这是我从服务器获得的日期:

func CurrentdateAndTime(){



        let url=URL(string: "\(address)date/getNewDate")


        var urlrequest=URLRequest(url: url!)

        print(url)

        var time:String=""


        urlrequest.httpMethod = "GET"

        URLSession.shared.dataTask(with: urlrequest) { (data, response, error) in


            if let data=data {

                let json=String(data: data, encoding: String.Encoding.utf8)

                let b:Double=Double(json!)!

               // if !b.isZero{
                    self.setComperehensiveDate(longDate: b)
                    self.settime(longTime: b)
                    self.setDay(day: b)
                    self.setYear(year: b)
                    self.setmonth(month: b)
                    self.setHour(longTime: b)
                    self.setMin(longTime: b)
                    self.onComplete?("ok?")
              }


            }.resume()


    }



 func setComperehensiveDate(longDate:Double){

        let dbl = TimeInterval(longDate)

        let date = Date(timeIntervalSince1970: dbl / 1000)

        //let formatter = DateFormatter()

        print("long",longDate,dbl)

//        formatter.calendar = Calendar(identifier: .persian)
 //       formatter.locale = Locale(identifier: "fa_IR")
  //      formatter.timeZone = TimeZone(identifier: "IRST")
        //formatter.dateFormat = "yyyy-MM-dd HH:MM:ss"
        //let a = formatter.string(from: date)


      // resultDate = formatter.date(from: a)

        resultDate = date
        print("aaa",resultDate)

    }

我从服务器上设置的 func 获得毫秒,然后我得到它

我通过这种方式获得 minDate 数据:

self.minDate=getcomperehensiveDate()

更新:我的问题是,如果用户手动将他的设备日期带到过去或将来,选择器会显示我不想要的过去。我必须显示当前日期,这就是为什么我要编程设置日期并面临这个问题,那么你对这种情况有什么想法?

【问题讨论】:

  • 能否添加设置datepicker2 日期的代码?
  • 更新我的第一篇文章
  • 你能打印self.minDate吗?
  • 2018-08-08 09:39:47 +0000

标签: ios swift xcode date datepicker


【解决方案1】:

您的问题是因为您在 viewDidAppear 中设置了 UIDatePicker 日期。 viewDidAppear 和 viewWillApear 不够可靠,不能用于调用一次设置器,请使用 viewDidLoad,因为它保证只调用一次。

我很难学到这一点,在有问题的日期设置器中放置一个断点后,我将其追溯到它是在 viewDidLayoutSubviews 覆盖中设置的事实。显然是另一个不可以导致我提出你的问题。

【讨论】:

    【解决方案2】:

    datepickerAction在真实设备或模拟器上更改datepicker2的值后调用。

    以下应该正常工作:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        datepicker2.datePickerMode = .date
        datepicker2.timeZone = TimeZone(identifier: "IRST")
        datepicker2.calendar = Calendar(identifier: .persian)
        datepicker2.locale = Locale(identifier: "fa_IR")
        // The following line is setting the datepicker2.date to Tomorrow, because you haven't posted the code giving self.minDate
        datepicker.date = Date().addingTimeInterval(24 * 3600)
    }
    
    func datepickerAction(_ sender: UIDatePicker) {
        let date = self.datepicker2.date
        let components = Calendar.current.dateComponents([.month, .day,.year], from: date)
        let month = components.month //This is the month component, not the hour like in your code
        let day = components.day //This is the day component, not the hour like in your code
        let yr = components.year
        print(day!,month!,yr!)
    } 
    

    如果您想要小时和分钟组件,您只需像这样定义components

    let components = Calendar.current.dateComponents([.minute, .hour, .month, .day,.year], from: date)
    let hour = components.hour
    let minutes = components.minute
    

    【讨论】:

    • @M0TRIX 你能详细说明一下吗?什么不工作?
    • 和原来一样。只返回一个日期
    • 你的意思是,它总是打印相同的字符串?即使您在模拟器/真实设备中手动更改日期?
    • 我已经更新了我的答案。如果您可以发布与self.minDate相关的所有代码,将会很有帮助
    • 再次查看我的第一篇文章
    【解决方案3】:

    我可以看到你的线路有问题

    let date = self.datepicker2.date
    

    它必须得到相同的日期或其他东西。我可以看到你给出了相同的日期

    datepicker2.date=self.minDate (this is issue)
    

    我刚刚尝试过使用

    @IBAction func change(_ sender: Any) {
    
            let components = Calendar.current.dateComponents([.month, .day,.year], from: datepicker.date)
            let hour = components.month
            let minute = components.day
            let yr=components.year
            print(hour,minute,yr)
        }
    

    同样的选择器工作正常。 请从链接下载项目:

    https://github.com/sanojKashyap/51799141_S

    【讨论】:

    • 当我评论我的设置日期命令时,它运行良好,但我需要设置一个日期
    • 你的日期没有改变,尝试使用 datepicker 日期。
    • 我的问题是,如果用户手动将他的设备日期带到过去或将来,选择器会显示我不想要的过去。我必须显示当前日期,这就是为什么我要编程设置日期并面临这个问题,那么你对这种情况有什么想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多