【问题标题】:Time validation always return false. PHP DateTime, Laravel时间验证总是返回 false。 PHP 日期时间,Laravel
【发布时间】:2019-01-05 19:17:45
【问题描述】:

我正在尝试创建一个控制器来验证时间变量日期和时间。 问题是代码可以正确验证日期和签入时间,但签出时间总是得到错误的值。 $checkOut 的每个变量总是以 Not Valid, Wrong Check Out Time Format 结束验证。

更新:现在我在这里只使用 2 个控制器,扩展 checkerController 的 debug_controller 将接收 csv 文件并检查 csv 文件中的每一行。 如果有任何无效的数据格式,$result 将包含“格式无效的原因”。使用此代码validateDate($id, $date, $checkIn, $checkOut),其值为$checkOut,实际上应该为false,返回false。

奇怪的是,当我使用较少的 csv 文件行时,最后一行实际上可以返回 true。

csv 文件内

198601082010082030,2018-02-30,07:15:01,14:00:00
198601082010082030,2018-06,08:15:01,14:00:00
198601082010082030,2018-06-05,25:15:01,14:00:00
198601082010082030,2018-06-05,08:15,14:00:00
198601082010082030,2018-06-05,08:15:01,14:00:00
198601082010082030,2018-06-06,13:50:32,14:10:00
198601082010082030,2018-06-07,07:50:33,15:10:00
198601082010082030,2018-02-30,07:50:33,15:10:00
198601082010082030,2018-06-07,26:50:33,15:10:00
198601082010082030,2018-06-08,07:50:34,16:10:00
198601082010082030,2018-06-09,07:50:35,15:00:00
198601082010089999,2018-06-10,07:30:00,15:20:00
198601082010082030,2018-06-11,07:30:01,15:00:30
198601082010082030,2018-06-12,07:30:02,15:00:30
198601082010082030,2018-06-13,07:30:03,15:00:30
198601082010082030,2018-06-14,07:30:04,15:00:30

第一个控制器包含检查输入的功能

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use DateTime;

class checkerController extends Controller {

    function validateTime($time)
    {
        $d = DateTime::createFromFormat('H:i:s', $time);
        return $d && $d->format('H:i:s') == $time;
    }

    function validateDate($id, $date, $checkIn, $checkOut)
    {
        $d = DateTime::createFromFormat('Y-m-d', $date);
        $valid = ($d && $d->format('Y-m-d') == $date);
        if ($valid == false) {
            $data = "Not Valid, Wrong Date Format";
            return $data;
        } else {
            $validCheckOut = $this->validateTime("$checkOut");
            if ($validCheckOut == false) {
                return "checkout not valid --> $checkOut";
            } else {
                return "checkout valid";
            }

        }
    }
}

第二个控制器,获取请求csv文件,继承父checkerController

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Str;
use Storage;


class debug_controller extends checkerController {

    function index(request $request){
        $ext = $request->file('csv')->getClientOriginalExtension();
        $filename = Str::random(10).".$ext";
        $path=$request->file('csv')->storeAs('public/csv/', $filename);
        $dir = asset("storage/csv/$filename");
        $file = file("$dir");
        $arrContent = Array();
        foreach ($file as $key) {
            list($id,$date,$checkIn,$checkOut)=explode(",", $key);
            $result = $this->validateDate($id,$date,$checkIn,$checkOut);;           
            $arrtemp = array('id'=> $id, 'date' => $date, 'checkIn' => $checkIn, 'checkOut' => $checkOut, 'result' => $result);
            array_push($arrContent, $arrtemp);
        }
        foreach ($arrContent as $row) {
            echo $row['id']." | ".$row['date']." | ".$row['checkIn']." | ".$row['checkOut']." | ".$row['result']."<br><br>";
            }   
    }
}
?> 

【问题讨论】:

  • 旁注:改掉代码中混用语言的坏习惯。你有英文命名变量,还有($nip, $tanggal, $masuk, $keluar)。坚持一种语言(最好,英语)
  • 实际上所有变量都是我的母语,需要一些时间将所有变量更改为英文,但我会尝试仅为 stackoverflow 上的这篇文章更改它。
  • 我已经更改了所有变量名称先生@MarcinOrlowski
  • 你的$date参数是Y-m-d格式吗?
  • 您的代码没有问题。尝试使用$data = "Not Valid, Wrong Check Out Time Format -- " . $checkOut; 调试结果,这样你就可以看到是什么出错了

标签: php laravel validation date


【解决方案1】:

问题在于输入。

198601082010082030,2018-02-30,07:15:01,14:00:00
198601082010082030,2018-06,08:15:01,14:00:00
198601082010082030,2018-06-05,25:15:01,14:00:00
198601082010082030,2018-06-05,08:15,14:00:00
198601082010082030,2018-06-05,08:15:01,14:00:00
198601082010082030,2018-06-06,13:50:32,14:10:00
198601082010082030,2018-06-07,07:50:33,15:10:00
198601082010082030,2018-02-30,07:50:33,15:10:00
198601082010082030,2018-06-07,26:50:33,15:10:00
198601082010082030,2018-06-08,07:50:34,16:10:00
198601082010082030,2018-06-09,07:50:35,15:00:00
198601082010089999,2018-06-10,07:30:00,15:20:00
198601082010082030,2018-06-11,07:30:01,15:00:30
198601082010082030,2018-06-12,07:30:02,15:00:30
198601082010082030,2018-06-13,07:30:03,15:00:30
198601082010082030,2018-06-14,07:30:04,15:00:30

为了获取列的每个值,我使用list($id,$date,$checkIn,$checkOut)=explode(",", $key); 将每一列分配给一个变量。 问题是最后一个分解的值没有, 作为分隔符。所以即使值是完全相同的字符串,由于某种原因它总是返回 false。 当我将逗号添加到最后一个值时,代码可以很好地验证。 这是添加了逗号最后一个值的输入:

198601082010082030,2018-02-30,07:15:01,14:00:00,
198601082010082030,2018-06,08:15:01,14:00:00,
198601082010082030,2018-06-05,25:15:01,14:00:00,
198601082010082030,2018-06-05,08:15,14:00:00,
198601082010082030,2018-06-05,08:15:01,14:00:00,
198601082010082030,2018-06-06,13:50:32,14:10:00,
198601082010082030,2018-06-07,07:50:33,15:10:00,
198601082010082030,2018-02-30,07:50:33,15:10:00,
198601082010082030,2018-06-07,26:50:33,15:10:00,
198601082010082030,2018-06-08,07:50:34,16:10:00,
198601082010082030,2018-06-09,07:50:35,15:00:00,
198601082010089999,2018-06-10,07:30:00,15:20:00,
198601082010082030,2018-06-11,07:30:01,15:00:30,
198601082010082030,2018-06-12,07:30:02,15:00:30,
198601082010082030,2018-06-13,07:30:03,15:00:30,
198601082010082030,2018-06-14,07:30:04,15:00:30,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多