문자열이 날짜인지 확인하는 함수
PHP를 사용하여 문자열이 날짜/시간인지 확인하는 함수를 작성하려고 합니다.기본적으로 유효한 날짜/시간은 다음과 같습니다.
2012-06-14 01:46:28
분명히 완전히 동적인 값 중 어떤 것이든 변경될 수 있지만 항상 다음과 같은 형태로 되어 있어야 합니다.XXXX-XX-XX XX:XX:XX
이 패턴을 체크하고 일치하는 경우 true를 반환하려면 정규 표현을 어떻게 써야 합니까?
이 문자열이 전체 문자열인 경우 구문 분석을 시도해 보십시오.
if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== false) {
// it's a date
}
문자열이 날짜인지 확인하는 가장 쉬운 방법:
if(strtotime($date_string)){
// it's in date format
}
정규식을 사용하지 않는 다른 방법을 다음에 나타냅니다.
function check_your_datetime($x) {
return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
날짜 형식을 모르는 경우:
/**
* Check if the value is a valid date
*
* @param mixed $value
*
* @return boolean
*/
function isDate($value)
{
if (!$value) {
return false;
}
try {
new \DateTime($value);
return true;
} catch (\Exception $e) {
return false;
}
}
var_dump(isDate('2017-01-06')); // true
var_dump(isDate('2017-13-06')); // false
var_dump(isDate('2017-02-06T04:20:33')); // true
var_dump(isDate('2017/02/06')); // true
var_dump(isDate('3.6. 2017')); // true
var_dump(isDate(null)); // false
var_dump(isDate(true)); // false
var_dump(isDate(false)); // false
var_dump(isDate('')); // false
var_dump(isDate(45)); // false
제 프로젝트에서는 이것이 효과가 있는 것 같습니다.
function isDate($value) {
if (!$value) {
return false;
} else {
$date = date_parse($value);
if($date['error_count'] == 0 && $date['warning_count'] == 0){
return checkdate($date['month'], $date['day'], $date['year']);
} else {
return false;
}
}
}
이 함수를 PHP 함수의 파라미터로 사용합니다.
- 날짜를 확인합니다.
yyyy-mm-dd hh:mm:ss
포맷 - 패턴과 일치하지만 여전히 유효하지 않은 날짜(4월 31일 등)를 거부합니다.
function filter_mydate($s) {
if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$@', $s, $m) == false) {
return false;
}
if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) {
return false;
}
return $s;
}
이 답변은 받아들여지고 있지만, 모든 경우에 유효하게 기능하는 것은 아닙니다.예를 들어, "10/38/2013" 날짜를 사용하여 폼 필드에 날짜 검증을 테스트하면 유효한 DateObject가 반환되지만, 날짜는 PHP가 "오버플로우"라고 부르는 날짜이므로 "10/38/2013"은 "11/07/2013"이 됩니다.일리는 있지만, 개정된 날짜를 받아들일까요, 아니면 사용자에게 정확한 날짜를 입력하도록 강요할까요?검증 나치의 경우 https://stackoverflow.com/a/10120725/486863을 사용하여 오브젝트가 이 경고를 울리면 false를 반환할 수 있습니다.
다른 회피책은 문자열 날짜를 포맷된 날짜와 대조하여 두 날짜를 비교하여 동일한 값을 얻는 것입니다.이것도 엉망진창인 것 같아아, 그렇군요.이것이 PHP dev의 특성입니다.
https://stackoverflow.com/a/19271434/1363220,에서 답을 찾았습니다.
$d = DateTime::createFromFormat($format, $date);
// The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
if($d && $d->format($format) === $date) {
//it's a proper date!
}
else {
//it's not a proper date
}
if (strtotime($date) > strtotime(0)) {
echo 'it is a date'
}
이 경우 Regex를 사용하지 않고 문자열을 분할하여 날짜가 유효한지 확인합니다.
list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring);
if(!checkdate($month, $day, $year)) {
/* print error */
}
/* check $hour, $minute and $second etc */
regEx를 사용하기로 마음먹은 경우 txt2re.com은 항상 유용한 리소스입니다.
<?php
$txt='2012-06-14 01:46:28';
$re1='((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))'; # Time Stamp 1
if ($c=preg_match_all ("/".$re1."/is", $txt, $matches))
{
$timestamp1=$matches[1][0];
print "($timestamp1) \n";
}
?>
당신이 PHP 5.2를 가지고 있다면 Joey의 답변은 작동하지 않을 것입니다.PHP의 DateTime 클래스를 확장해야 합니다.
class ExDateTime extends DateTime{
public static function createFromFormat($frmt,$time,$timezone=null){
$v = explode('.', phpversion());
if(!$timezone) $timezone = new DateTimeZone(date_default_timezone_get());
if(((int)$v[0]>=5&&(int)$v[1]>=2&&(int)$v[2]>17)){
return parent::createFromFormat($frmt,$time,$timezone);
}
return new DateTime(date($frmt, strtotime($time)), $timezone);
}
}
이 클래스는 문제없이 사용할 수 있습니다.
ExDateTime::createFromFormat('d.m.Y G:i',$timevar);
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
이것은 저에게 해결이 될 뿐만 아니라, 다른 여러 가지 문제점도 제시합니다.
function validateTimeString($datetime, $format = "Y-m-d H:i:s"){
return ($datetime == date($format, strtotime($datetime)));
}
틀에 박히지 않은 API로 작업할 때, 잘 정의된 날짜 형식이 아닌 다소 지저분한 결과를 얻을 수 있습니다.그래서 다소 품위 없는 수업을 사용하고 있고, 원칙적으로는 잔혹하고 틀에 박히지 않은 수업이라는 것은 선뜻 인정하지만, 가끔은 도움이 되기도 합니다^^.
class DateHelper
{
private const DATE_FORMATS = [
DATE_ATOM,
DATE_COOKIE,
DATE_RFC822,
DATE_RFC850,
DATE_RSS,
DATE_W3C,
"Y-m-d\TH:i:s.u",
'Y-m-d\TH:i:s',
"Y-m-d'T'H:i:s.SSS'Z'",
"Y-m-d\TH:i:s.uP",
"Y-m-d\TH:i:sP",
"d/m/Y H:i:s",
];
/**
* @param string $inputStringDate
* @return DateTime|null
*/
public static function createDateFromUnknownFormat(string $inputStringDate): ?DateTime
{
$inputStringDate = str_replace('/', '-', $inputStringDate);
preg_match('/^(\d{4})\-(\d{2})-(\d{2})$/', $inputStringDate, $result);
if (!empty($result)) {
return DateTime::createFromFormat('Y-m-d', $inputStringDate);
}
preg_match('/^(\d{2})\-(\d{2})-(\d{4})$/', $inputStringDate, $result);
if (!empty($result)) {
return DateTime::createFromFormat('d-m-Y', $inputStringDate);
}
foreach (self::DATE_FORMATS as $dateFormat) {
if ($dateObject = DateTime::createFromFormat($dateFormat, $inputStringDate)) {
return $dateObject;
}
}
return null;
}
}
간단한 해결책은 다음과 같습니다.
echo is_numeric( strtotime( $string ) ) ? 'Yes' : 'No';
strtotime
? 정규이요?★★★★★★★★★★★★★★★★★?
PHP의 네이티브 Date Time 객체에 무슨 문제가 있습니까?
http://www.php.net/manual/en/datetime.construct.php
언급URL : https://stackoverflow.com/questions/11029769/function-to-check-if-a-string-is-a-date
'source' 카테고리의 다른 글
비단뱀의 람다로 if를 하는 방법이 있나요? (0) | 2023.02.06 |
---|---|
JavaScript - 문자열의 모든 콤마를 바꿉니다. (0) | 2023.02.01 |
SQL 퍼포먼스:순서 사용 시 OR 사용 속도가 IN보다 느립니다. (0) | 2023.02.01 |
vue.js를 사용하여 동적 클래스 이름 추가 (0) | 2023.02.01 |
Open을 위한 최적의 솔루션은 무엇입니까?장고 님? (0) | 2023.02.01 |