문자열이 Unix 타임스탬프인지 확인합니다.
문자열이 있는데 그것이 Unix 타임스탬프인지 아닌지를 확인해야 합니다.어떻게 하면 효율적으로 할 수 있을까요?
구글을 통해 이 글을 찾았지만, 유감스럽게도 확실한 답이 나오지 않았습니다.(그리고, 저는 앞의 스레드에 오리지널 포스터의 질문을 오려냈습니다).
좋아요, 한동안 이걸 만지작거린 후, 저는 그 해결책을 철회합니다.date('U')
대신 이것을 사용할 것을 제안합니다.
function isValidTimeStamp($timestamp)
{
return ((string) (int) $timestamp === $timestamp)
&& ($timestamp <= PHP_INT_MAX)
&& ($timestamp >= ~PHP_INT_MAX);
}
이 검사는 지정된 경우에만 true를 반환합니다.$timestamp
는 문자열로 숫자 및 옵션 마이너스 문자로만 구성됩니다.또한 이 숫자는 정수 비트 범위 내에 있어야 합니다(EDIT: 여기서 나타내는 바와 같이 실제로는 불필요합니다).
var_dump( isValidTimeStamp(1) ); // false
var_dump( isValidTimeStamp('1') ); // TRUE
var_dump( isValidTimeStamp('1.0') ); // false
var_dump( isValidTimeStamp('1.1') ); // false
var_dump( isValidTimeStamp('0xFF') ); // false
var_dump( isValidTimeStamp('0123') ); // false
var_dump( isValidTimeStamp('01090') ); // false
var_dump( isValidTimeStamp('-1000000') ); // TRUE
var_dump( isValidTimeStamp('+1000000') ); // false
var_dump( isValidTimeStamp('2147483648') ); // false
var_dump( isValidTimeStamp('-2147483649') ); // false
PHP_ 체크INT_MAX는 스트링을 다음 명령에서 올바르게 사용할 수 있도록 하기 위한 것입니다.date
또, 예를 들면, 이러한 일이 발생하지 않게 합니다.*
echo date('Y-m-d', '2147483648'); // 1901-12-13
echo date('Y-m-d', '-2147483649'); // 2038-01-19
64비트 시스템에서는 당연히 정수가 그 정수보다 크므로 함수는 "2147483648" 및 "-2147483649"에 대해 false를 반환하지 않고 대응하는 큰 숫자에 대해 false를 반환합니다.
(*) 주의: 비트 범위는 사용할 수 있는 날짜와 일치하기 때문에 100% 확신할 수 없습니다만,
unix 타임스탬프는 정수이므로 is_int()를 사용합니다.단,is_int
()는 문자열에서는 동작하지 않습니다.숫자인지 여부 및 인터갤 형식이 원래 형식과 동일한지 확인합니다.예:
( is_numeric($stamp) && (int)$stamp == $stamp )
저는 같은 질문을 떠올렸고, 제 자신을 위해 다음과 같은 해결책을 만들었습니다. 규칙적인 표현이나 지저분한 if-clauses를 건드리지 않아도 됩니다.
/**
* @param string $string
* @return bool
*/
public function isTimestamp($string)
{
try {
new DateTime('@' . $string);
} catch(Exception $e) {
return false;
}
return true;
}
이 방법은 다음과 같습니다.
function is_timestamp($timestamp) {
if(strtotime(date('d-m-Y H:i:s',$timestamp)) === (int)$timestamp) {
return $timestamp;
} else return false;
}
is_disclos() 체크 및 기타 모든 종류의 체크도 추가할 수 있습니다.
이것이 기본이 될 수도 있습니다.
@TD_Nijboer에 대한 응답이 개선되었습니다.
이렇게 하면 지정된 문자열이 타임스탬프가 아닌 경우 예외가 발생하는 것을 방지할 수 있습니다.
function isTimestamp($timestamp) {
if(ctype_digit($timestamp) && strtotime(date('Y-m-d H:i:s',$timestamp)) === (int)$timestamp) {
return true;
} else {
return false;
}
}
이는 음의 시간(1970년 이전)도 고려되지 않으며 확장 범위도 고려되지 않습니다(타임스탬프가 2038년 이후의 값을 나타낼 수 있도록 64비트 정수를 사용할 수 있습니다).
$valid = ctype_digit($str) && $str <= 2147483647;
또는
if ($startDate < strtotime('-30 years') || $startDate > strtotime('+30 years')) {
//throw exception
}
문자열에 높은 숫자가 포함되어 있는지 확인하시겠습니까?
is_syslog()가 키입니다.
또는 DateTime으로 변환하여 예상 날짜 범위와 같은 몇 가지 검사를 수행합니다.
이 솔루션을 is_numeric()로 대체할 경우 php 네이티브 함수는 타임스탬프 형식이 아닌 "1.1", "0123", "0xFF" 등의 입력 문자열에 대해 잘못된 긍정을 제공한다는 점을 고려해 주십시오.
또 다른 가능성:
$date_arg = time();
$date_is_ok = ($date_arg === strtotime(date('c', $date_arg)));
//if anything else than digits inside the string then your string is no timestamp
//in which case maybe try to get the timestamp with strtotime
if(preg_match('/[^\d]/', $str)) {
$str = strtotime($str);
if (false === $str) {
//conversion failed - invalid time - invalid row
return;
}
}
타임스탬프가 유효한 그레고리 날짜를 나타내는지 확인하기 위한 PHP에서는 다음과 같이 처리되었습니다.
function checkdateTimestamp($timestamp) {
return checkdate((int)date('m',$timestamp),(int)date('d',$timestamp),(int)date('Y',$timestamp));
}
타임스탬프에서 utc와 보통 11/13 자리보다 큰 두 가지 체크를 수행합니다.
// Is Timestamp control function
function isTimestamp($x,$lenMax = 11,$compare = 30){
if (!ctype_digit($x)) return false;
$x = strlen($x) >= $lenMax ? $x / 1000 : $x;
if ($x < strtotime("-{$compare} years") || $x > strtotime("+{$compare} years")) {
return false;
}
return true;
}
// Timestamp UTC usually take from javascript -> Date.Now() -> 1618362206593
echo check_timestamp(1618362206593); // Return -> true
// or that stand time()
echo check_timestamp(1618359229); // return -> true
// UTC
echo check_timestamp(5618362206593); // Return -> false
// or that stand time()
echo check_timestamp(5618359229); // return -> false
언급URL : https://stackoverflow.com/questions/2524680/check-whether-the-string-is-a-unix-timestamp
'programing' 카테고리의 다른 글
PHP curl을 사용한HTTP 기본 인증을 사용하여 어떻게 요청합니까? (0) | 2022.09.15 |
---|---|
MySQL을 "최적 일치"별로 주문 (0) | 2022.09.15 |
Vue CLI 3: 정의된 출력 경로 (0) | 2022.09.15 |
mysql에서 읽지 않은 기사를 가져오기 위한 데이터베이스 설계(1억 개 이상의 행 테이블) (0) | 2022.09.15 |
MDB(Access) 파일을 MySQL(또는 일반 SQL 파일)로 변환하려면 어떻게 해야 합니까? (0) | 2022.09.15 |