PHP에서 날짜를 타임 스탬프로 변환하는 방법?


350

예를 들어 타임 스탬프는 어떻게 얻 22-09-2008습니까?

답변:


612


이 방법은 작동 모두 윈도우와 유닉스 하고 있다 시간대 당신이 작업하는 경우 당신이 원하는 아마 인 인식 날짜 .

시간대를 신경 쓰지 않거나 서버가 사용하는 시간대를 사용하려는 경우 :

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (서버 시간대에 따라 다릅니다 ...)


시간대를 지정하려면 여기에서 EST. (뉴욕과 동일)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


또는 UTC 를 사용하려는 경우 . ( " GMT " 와 동일 )

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


그럼에도 불구하고 문자열을 구조화 된 데이터로 구문 분석 할 때 항상 엄격하게 시작하는 것이 좋습니다. 나중에 어색한 디버깅을 저장할 수 있습니다. 따라서 항상 날짜 형식을 지정하는 것이 좋습니다.


2
우아한. 나는 그것을 잊었다!
까지

53
이 답변에 대한 크레딧을 아직받지 못한 것은 어떻습니까?!
Mark Tomlin

4
완전히 유효한 답변이지만 Armin Ronacher의 답변이 공감대와 일치하지 않는다는 사실에 놀랐습니다. 모호성은 항상 나쁩니다.
RonLugge

1
@Devner 글쎄, 내 서버에서는 해당 형식이 지원되지 않는 것 같습니다. 어쩌면 당신과 다를 수도 있습니다.
Lucas

1
이 솔루션은 예기치 않은 동작을 유발할 수 있습니다. PHP 5.3+를 사용하는 사람들은 Prof. Falken answer을 채택해야 하며, 날짜 형식을 완전히 제어 할 수 있습니다.
Luca Fagioli

185

정확히 하나의 형식을 기대하는 strptime () 도 있습니다 .

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900);

4
대신 tm_month의 tm_mon하고 대신 tm_day의 tm_mday한다
amarillion

68
Windows에서는 strptime 기능을 사용할 수 없습니다.
understack

12
Windows 및 PHP 5.3.0 이상을 사용하는 경우 date_parse_from_format대신 사용 을 고려하십시오 strptime.
Erwin Wessels 2016 년

1
... strptimeWindows 플랫폼에서 구현되지 않았기 때문에 .
Randell

이것은 투표율이 높은 답변이므로 Windows 용 PHP 및 UNIX에서 작동하는 답변으로 편집하는 것을 고려 하시겠습니까? 그리고 IMHO는 이상적으로 시간대를 언급해야합니다.
Falken 교수 계약은

126

DateTimeAPI :

$dateTime = new DateTime('2008-09-22'); 
echo $dateTime->format('U'); 

// or 

$date = new DateTime('2008-09-22');
echo $date->getTimestamp();

절차 적 API와 동일

$date = date_create('2008-09-22');
echo date_format($date, 'U');

// or

$date = date_create('2008-09-22');
echo date_timestamp_get($date);

당신이 사용하고 있기 때문에 위의 오류가 발생하면 지원되지 않는 형식을 , 당신은 사용할 수 있습니다

$date = DateTime::createFromFormat('!d-m-Y', '22-09-2008');
echo $dateTime->format('U'); 

// or

$date = date_parse_from_format('!d-m-Y', '22-09-2008');
echo date_format($date, 'U');

을 설정하지 않으면 !시간 부분이 현재 시간으로 설정되며 시간을 생략 할 때 자정을 사용하는 처음 4 시간과 다릅니다.

또 다른 대안은 IntlDateFormatterAPI 를 사용하는 것입니다 .

$formatter = new IntlDateFormatter(
    'en_US',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'GMT',
    IntlDateFormatter::GREGORIAN,
    'dd-MM-yyyy'
);
echo $formatter->parse('22-09-2008');

현지화 된 날짜 문자열로 작업하지 않는 한 더 쉬운 선택은 DateTime입니다.


15
요즘 내 대답보다 이것을 권장합니다.
까지

Arggg. ! ! DateTime은 요청하거나 알리지 않고 현재 시간을 추가하는 데 도움이되었으므로 내 날짜 기반 타임 스탬프가 새로 고칠 때마다 변경되어 나를 미치게하는 것을 잊지 마십시오 . Grrr.

모호한 날짜 구문 분석에 대해 권장하고 날짜 문자열을 구문 분석 할 때 날짜 형식을 명시 적으로 제공해야한다고 덧붙이고 싶습니다.
Falken 교수 계약은

114

strtotime()당신이 의미하는 바를 "추측"하려고하는 것과 같은 기능에주의 하십시오 .

사실 22-09-2008로 구문 분석됩니다 2008년 9월 22일 이 유일한 합리적인 것 같이.

어떻게 08-09-2008파싱됩니까? 아마 2008 년 8 월 9 일 .

무엇에 대해 2008-09-50? 일부 PHP 버전에서는 2008 년 10 월 20 일로 구문 분석합니다 .

따라서 입력 DD-MM-YYYY형식 이 확실하다면 @Armin Ronacher가 제공하는 솔루션을 사용하는 것이 좋습니다 .


5
유효한 우려. strtotime ()은 로케일에 의존한다고 생각합니다.
까지

13
참고 : 대부분의 비영어권 국가에, 형식은 dd-mm-yyyy, 없습니다 mm-dd-yyyy.
Camilo Martin

1
대부분의 비 영어 사용 가능 국가 최초의 형식을 사용 @CamiloMartin 당신은 언급하지만 DB는 일반적으로 날짜 저장 YYYY-mm-dd변환은 사용자에게만 표시로 발생
Danny22

@DannyG는 방금 문서를 보았고 DB가 MySQL을 의미한다면 맞습니다. 그러나 이것을하는 것은 어리석은 것 같습니다 ...
Camilo Martin

57


이 방법은 작동 모두 윈도우와 유닉스 하고 있다 시간대 당신이 작업하는 경우 당신이 원하는 아마 인 인식 날짜 .

시간대를 신경 쓰지 않거나 서버가 사용하는 시간대를 사용하려는 경우 :

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (서버 시간대에 따라 다릅니다 ...)


시간대를 지정하려면 여기에서 EST. (뉴욕과 동일)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


또는 UTC 를 사용하려는 경우 . ( " GMT " 와 동일 )

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


그럼에도 불구하고 문자열을 구조화 된 데이터로 구문 분석 할 때 항상 엄격하게 시작하는 것이 좋습니다. 나중에 어색한 디버깅을 저장할 수 있습니다. 따라서 항상 날짜 형식을 지정하는 것이 좋습니다.


팔켄 안녕하세요, 천만에요 그러나이 솔루션이 PHP 5.3+에 적용되도록 지정하는 것이 좋습니다.
Luca Fagioli

43

mktime 사용 :

list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);

그것이 내가 항상 한 일입니다. -또는 / 또는로 분해하십시오. 또는 분리 된 것이 무엇이든 mktime입니다.
Rich Bradshaw

1
mktime 함수의 마지막 매개 변수에 대한 PHP 매뉴얼에 메모가 있습니다. "PHP 5.1.0부터이 매개 변수는 더 이상 사용되지 않습니다. 결과적으로 새로운 시간대 처리 기능을 대신 사용해야합니다." 나는 그들이 링크하지 않았기 때문에 그들이 말하는 새로운 기능이 무엇인지 아직 발견하지 못했습니다!
매우 불규칙한

이것은 strtotime()어떤 이유로 strtotime()특정 날짜에 작동하지 않으므로 매우 신뢰할 수 없습니다.
dspacejs

17

strtotime () 함수를 사용하면 날짜를 타임 스탬프로 쉽게 변환 할 수 있습니다

<?php
// set default timezone
date_default_timezone_set('America/Los_Angeles');

//define date and time
$date = date("d M Y H:i:s");

// output
echo strtotime($date);
?> 

추가 정보 : http://php.net/manual/en/function.strtotime.php

온라인 변환 도구 : http://freeonlinetools24.com/


미래 독자들에게 -strtotime () 은 우연이었으며 사용을 권장해서는 안됩니다. 날짜 형식을 추측하려고하기 때문에 모호합니다. 올바르게 사용하더라도 코드를 이해하고 추론하기가 어려워지고 코드 기반이 변경되어 오류가 발생할 위험이 있습니다. strtotime ()에 무엇을 주든 상관없이 추측하는 것이 가장 좋습니다. 그 추측은 틀릴 수도 있지만, 잘못 추측했다는 표시는 없습니다. 권총입니다. 원하는 경우 사용하지만 초보자는 제 생각에 경고를 사용할 수 있습니다. 주의 : 풋건 전방
Falken 교수 계약은

12

다음은 splitand mtime함수를 사용하는 매우 간단하고 효과적인 솔루션입니다 .

$date="30/07/2010 13:24"; //Date example
list($day, $month, $year, $hour, $minute) = split('[/ :]', $date); 

//The variables should be arranged according to your date format and so the separators
$timestamp = mktime($hour, $minute, 0, $month, $day, $year);
echo date("r", $timestamp);

그것은 나를 위해 매력처럼 작동했습니다.


split ()은 더 이상 사용되지 않지만 ol php 버전을 사용하는 경우 훌륭하게 작동합니다!
Hugo H

6

이 기능 strptime()은 Windows 에서 작동 하지 않으며 strtotime()예기치 않은 결과를 반환 할 수 있으므로 date_parse_from_format()다음을 사용하는 것이 좋습니다 .

$date = date_parse_from_format('d-m-Y', '22-09-2008');
$timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);

2
참고 : strtotime () : 구분 기호는 슬래시 (/)이며 미국식 m / d / y로 가정합니다. 반면 구분 기호가 대시 (-) 또는 점 (.)이면 유럽 dmy 형식이 가정됩니다. 따라서 strptime ()을 사용할 필요가 없다고 생각합니다.
secretlm

6

날짜가 예상 한 것으로 구문 분석되는지 확인하려면 다음을 사용할 수 있습니다 DateTime::createFromFormat().

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008');
if ($d === false) {
    die("Woah, that date doesn't look right!");
}
echo $d->format('Y-m-d'), PHP_EOL;
// prints 2008-09-22

이 경우에는 분명하지만 예를 들어 03-04-20084 월 3 일 또는 3 월 4 일이 될 수 있습니다.


1
DateTime::createFromFormat false오류 가 아닌을 반환합니다null .
mpen

5

형식에 대해 추측하기 strptime때문에 형식 사용을 알고 있다면 strtotime항상 올바른 것은 아닙니다. strptimeWindows에서 구현되지 않았 으므로 사용자 정의 기능이 있습니다

반환 tm_year값은 1900부터입니다. 그리고 tm_month0-11입니다

예:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900)




3
function date_to_stamp( $date, $slash_time = true, $timezone = 'Europe/London', $expression = "#^\d{2}([^\d]*)\d{2}([^\d]*)\d{4}$#is" ) {
    $return = false;
    $_timezone = date_default_timezone_get();
    date_default_timezone_set( $timezone );
    if( preg_match( $expression, $date, $matches ) )
        $return = date( "Y-m-d " . ( $slash_time ? '00:00:00' : "h:i:s" ), strtotime( str_replace( array($matches[1], $matches[2]), '-', $date ) . ' ' . date("h:i:s") ) );
    date_default_timezone_set( $_timezone );
    return $return;
}

// expression may need changing in relation to timezone
echo date_to_stamp('19/03/1986', false) . '<br />';
echo date_to_stamp('19**03**1986', false) . '<br />';
echo date_to_stamp('19.03.1986') . '<br />';
echo date_to_stamp('19.03.1986', false, 'Asia/Aden') . '<br />';
echo date('Y-m-d h:i:s') . '<br />';

//1986-03-19 02:37:30
//1986-03-19 02:37:30
//1986-03-19 00:00:00
//1986-03-19 05:37:30
//2012-02-12 02:37:30

3
<?php echo date('U') ?>

원하는 경우 MySQL 입력 유형 타임 스탬프 에 넣으십시오 . 위의 내용은 잘 작동합니다 (PHP 5 이상에서만).

<?php $timestamp_for_mysql = date('c') ?>

3

내가하는 방법은 다음과 같습니다.

function dateToTimestamp($date, $format, $timezone='Europe/Belgrade')
{
    //returns an array containing day start and day end timestamps
    $old_timezone=date_timezone_get();
    date_default_timezone_set($timezone);
    $date=strptime($date,$format);
    $day_start=mktime(0,0,0,++$date['tm_mon'],++$date['tm_mday'],($date['tm_year']+1900));
    $day_end=$day_start+(60*60*24);
    date_default_timezone_set($old_timezone);
    return array('day_start'=>$day_start, 'day_end'=>$day_end);
}

$timestamps=dateToTimestamp('15.02.1991.', '%d.%m.%Y.', 'Europe/London');
$day_start=$timestamps['day_start'];

이렇게하면 함수에 사용중인 날짜 형식을 알려주고 시간대를 지정할 수도 있습니다.


0

timestamp사용하여 변환 된 mysql의 날짜를 비교할 때 문제가 발생했기 때문에 데이터베이스에 날짜를 저장하도록 설정하면 시간대 / 시간대에주의하십시오 strtotime. 날짜를 타임 스탬프로 변환하기 전에 정확히 동일한 시간대를 사용해야합니다. 그렇지 않으면 strtotime ()은 기본 서버 시간대를 사용합니다.

이 예를 참조하십시오 : https://3v4l.org/BRlmV

function getthistime($type, $modify = null) {
    $now = new DateTime(null, new DateTimeZone('Asia/Baghdad'));
    if($modify) {
        $now->modify($modify);
    }
    if(!isset($type) || $type == 'datetime') {
        return $now->format('Y-m-d H:i:s');
    }
    if($type == 'time') {
        return $now->format('H:i:s');
    }
    if($type == 'timestamp') {
        return $now->getTimestamp();
    }
}
function timestampfromdate($date) {
    return DateTime::createFromFormat('Y-m-d H:i:s', $date, new DateTimeZone('Asia/Baghdad'))->getTimestamp();
}

echo getthistime('timestamp')."--".
    timestampfromdate(getthistime('datetime'))."--".
    strtotime(getthistime('datetime'));

//getthistime('timestamp') == timestampfromdate(getthistime('datetime')) (true)
//getthistime('timestamp') == strtotime(getthistime('datetime')) (false)

-4

UTC 날짜 / 시간 ( 2016-02-14T12:24:48.321Z)을 타임 스탬프 로 변환 하려면 다음과 같이하십시오.

function UTCToTimestamp($utc_datetime_str)
{
    preg_match_all('/(.+?)T(.+?)\.(.*?)Z/i', $utc_datetime_str, $matches_arr);
    $datetime_str = $matches_arr[1][0]." ".$matches_arr[2][0];

    return strtotime($datetime_str);
}

$my_utc_datetime_str = '2016-02-14T12:24:48.321Z';
$my_timestamp_str = UTCToTimestamp($my_utc_datetime_str);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.