无法解析日期

时间:2017-08-22 15:05:29

标签: c++ date time format

我有这段代码:

class ReportsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var reportList:[String] = []

var ref: DatabaseReference!

var handle: DatabaseHandle?

var pageStatus = "default"


@IBOutlet weak var reportsTableView: UITableView!

@IBAction func backButtonPressed(_ sender: UIButton) {
    self.performSegue(withIdentifier: "reportsToHome", sender: self)
}

@IBOutlet weak var segmentControl: UISegmentedControl!

@IBAction func segmentControlPressed(_ sender: UISegmentedControl) {
    switch segmentControl.selectedSegmentIndex
    {

    case 0:
        self.pageStatus = "unclaimed";
        self.reportsTableView.reloadData()
        print("0 selected " + self.pageStatus)
        return;
    case 1:
        self.pageStatus = "complete";
        self.reportsTableView.reloadData()
        print("1 selected " + self.pageStatus)
        return;
    case 2:
        self.pageStatus = "cancelled";self.reportsTableView.reloadData()
        print("2 selected " + self.pageStatus)
        return;
    default:
        break;
    }
}


public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return reportList.count

}


public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")

    cell.textLabel?.text = reportList[indexPath.row]

    return cell
}


override func viewDidLoad() {
    super.viewDidLoad()

    ref = Database.database().reference()

    handle = ref.child("Reports").observe(.childAdded, with: { (snapshot) in
            if let reports = snapshot.value as? NSDictionary {
                let firstName = reports["firstName"] as? String
                let lastName = reports["lastName"] as? String
                let user = reports["user"] as? String
                let status = reports["status"] as? String
                let userID = Auth.auth().currentUser?.uid

                for report in reports{
                    if user == userID{
                        if status == self.pageStatus{
                            self.reportList.append(firstName! + " " + lastName!)
                            self.reportsTableView.reloadData()

                        }
                        else{
                            print("not again")
                            print(self.pageStatus)
                            print(status)
                        }
                    }
                    else{
                        print(status ?? "page status" + self.pageStatus);
                        print(user);
                        print(userID)
                    }

                }
            }
    // Do any additional setup after loading the view.
    }
)}

它也不适用于“Sep”和%b,i。即它不适用于字符。 我做错了什么?

2 个答案:

答案 0 :(得分:2)

如果您检查tm的内容,那么它应该是您所期望的。

带有get_time

%a将解析为tm_wday

但是mktime根本不使用tm_wdaytm_yday,而是仅使用其他字段。事实上,mktime实际设置这些字段(这就是为什么tm输入不能是const)基于其他字段。

因此,你有效地将一堆零传递给它,特别是tm_year,并且许多平台上的time_t是自1970年以来的秒,并且尽管经常签名,但他们认为1970年之前的时间无效。 / p>

例如,对于MSVC,time_t是一个64位有符号整数,但mktime is documented仅对“1970年1月1日到2000年12月31日23:59:59”有效

答案 1 :(得分:0)

您的来电可能会成功写入t->tm_wday,但之后使用mktime时,time->tm_wday中的值会被忽略:

  

<强>的std :: mktime

     

...   time-&gt; tm_wday和time-&gt; tm_yday被忽略。时间的价值是   允许超出正常范围。 ...

因此,您在tm中写入的所有内容都会被忽略,结果无法表示为time_t,因此返回值为-1

mktime相比,std::put_time使用相应的值,但会针对输出重新解释它们(这样February可能变成Feb):

int main ()
{
    std::tm t = {};
    istringstream ss("Thursday February");
    ss >> std::get_time(&t, "%a %b");
    if (ss.fail()) {
        cout << "invalid date value." << endl;
    }
    else {
        std::cout << "Date: " << std::put_time(&t, "%a %b") << endl;
    }
    return 0;
}

输出:

Date: Thu Feb