如何将date转换为PHP中的时间戳?

如何从例如22-09-2008获得时间戳?

PHP的strtotime()给出

 $timestamp = strtotime('22-09-2008'); 

哪些与支持的date和时间格式文档兼容

还有strptime()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); 

小心使用像strtotime()这样的函数来尝试“猜测”你的意思(当然没有猜测, 规则在这里 )。

事实上, 2008年9月22日将被parsing为2008年9月22日 ,因为这是唯一合理的事情。

08-09-2008将如何parsing? 大概是2008年8月9日

那么2008-09-50呢? 有些版本的PHP将其parsing为2008年10月20日

所以,如果您确定您的input是DD-MM-YYYY格式,最好使用@Armin Ronacher提供的解决scheme。

使用DateTime API :

 $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('!dm-Y', '22-09-2008'); echo $dateTime->format('U'); // or $date = date_parse_from_format('!dm-Y', '22-09-2008'); echo date_format($date, 'U'); 

请注意,如果你不设置! ,时间部分将设置为当前时间,这与您在省略时间时使用午夜的前四位不同。

另一种select是使用IntlDateFormatter API:

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

除非您使用本地化的datestring,否则更容易的select可能是DateTime。

使用mktime :

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

如果你有PHP 5.3或以上,

这种方法适用于Windows和Unix 并且可以识别时区 ,如果您认真处理date,这可能就是您想要的。

如果你不关心时区,或者想使用服务器使用的时区:

 $d = DateTime::createFromFormat('dm-Y', '22-09-2008'); echo $d->getTimestamp(); 

1222093324 (这将取决于您的服务器时区…)

如果你想指定在哪个时区,这里是EST。 (和纽约一样)

 $d = DateTime::createFromFormat('dm-Y', '22-09-2008', new DateTimeZone('EST')); echo $d->getTimestamp(); 

1222093305

或者如果你想使用UTC。 (与“GMT”相同)

 $d = DateTime::createFromFormat('dm-Y', '22-09-2008', new DateTimeZone('UTC')); echo $d->getTimestamp(); 

1222093289

这是一个使用splitmtime函数的非常简单有效的解决scheme:

 $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); 

它对我来说就像一个魅力。

使用strtotime()函数,您可以轻松地将date转换为时间戳

 <?php // set default timezone date_default_timezone_set('America/Los_Angeles'); //define date and time $date = date("d MYH:i:s"); // output echo strtotime($date); ?> 

更多信息: http : //php.net/manual/en/function.strtotime.php

在线转换工具: http : //freeonlinetools24.com/

鉴于函数strptime()不适用于Windows,并且strtotime()可以返回意外的结果,我推荐使用date_parse_from_format()

 $date = date_parse_from_format('dm-Y', '22-09-2008'); $timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']); 
 $time = '22-09-2008'; echo strtotime($time); 

如果你想知道一个date是否被parsing成你期望的东西,你可以使用DateTime::createFromFormat()

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

在这种情况下很明显,但是03-04-2008可能是3月4日或4月3日,这取决于你来自哪里:)

如果您知道格式使用strptime因为strtotime会对格式进行猜测,这可能并不总是正确的。 由于strptime没有在Windows中实现,所以有一个自定义函数

请记住, tm_yeartm_year是从1900年! 而tm_month是0-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) 
 <?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?> 

http://php.net/manual/en/function.date.php

 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( "Ymd " . ( $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('Ymd 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 
 <?php echo date('U') ?> 

如果你想,把它放在一个MySQLinputtypes的时间戳。 上面的工作非常好(只在PHP 5或更高版本):

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

这是我该怎么做:

 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']; 

这样,你可以让函数知道你正在使用什么date格式,甚至指定时区。

如果你把它设置为在数据库中保存date,请注意时间/区域,因为我比较了使用strtotime转换为timestamp mysqldate时遇到的问题。 在将date转换为时间戳之前,您必须使用完全相同的时间/区域,否则,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('Ymd H:i:s'); } if($type == 'time') { return $now->format('H:i:s'); } if($type == 'timestamp') { return $now->getTimestamp(); } } function timestampfromdate($date) { return DateTime::createFromFormat('Ymd 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) 

如果您想将UTCdate时间( 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);