如何在PHP中转换日期为时间戳?

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

985806 次浏览

使用mktime:

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


此方法适用于 Windows和Unix 时区意识,这可能是你想要的,如果你使用日期

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

$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。(与“格林尼治时间”相同。)

$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


无论如何,在将字符串解析为结构化数据时,严格总是一个好的起点。这样可以省去将来调试的麻烦。因此,我建议始终指定日期格式。

还有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()这样试图“猜测”你的意思的函数(它当然不会猜测规则在这里)。

事实上,22-09-2008将被解析为九月二十二日,因为这是唯一合理的事情。

如何解析08-09-2008 ?可能2008年8月9日

2008-09-50呢?某些版本的PHP将其解析为10月20日

所以,如果你确定你的输入是DD-MM-YYYY格式,最好使用@Armin Ronacher提供的解决方案。

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

记住,返回值tm_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)

以下是我的做法:

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

这样,您可以让函数知道您使用的日期格式,甚至可以指定时区。

下面是一个非常简单而有效的解决方案,使用splitmtime函数:

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

这对我来说就像魔法一样。

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('!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');

注意,如果你不设置!,时间部分将被设置为当前时间,这与前四个不同,当你省略时间时,它们将使用午夜。

还有一种替代方法是使用IntlDateFormatter API:

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

除非您正在使用本地化的日期字符串,否则更容易的选择可能是DateTime。

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

鉴于函数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']);
<?php echo date('U') ?>

如果你愿意,可以把它放在MySQL输入类型时间戳中。上面的代码运行得很好(仅适用于PHP 5或更高版本):

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

如果你想确定一个日期是否被解析成你所期望的内容,你可以使用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-2008可以是4月3日或3月4日,这取决于你来自哪里:)


此方法适用于 Windows和Unix 时区意识,这可能是你想要的,如果你使用日期

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

$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。(与“格林尼治时间”相同。)

$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 echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>

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

$time = '22-09-2008';
echo strtotime($time);

使用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/

如果你想要将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);

如果你将它设置为保存数据库中的日期,请注意时间/时区,因为我在比较mysql中使用strtotime转换为timestamp的日期时遇到了一个问题。在将日期转换为时间戳之前,必须使用完全相同的时间/区域,否则,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)

使用PHP函数strtotime()

echo strtotime('2019/06/06');

date -格式化本地时间/日期

对于PHP >=5.3, 7 &8 .这可能会起作用

$date = date_parse_from_format('%Y-%m-%d', "2022-11-15"); //here you can give your desired date in desired format.
//just need to keep in mind that date and format matches.


$timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year'] + 2000); //this will return the timestamp


$finalDate= date('Y-m-d H:i:s', $timestamp); //now you can convert your timestamp to desired dateTime format.

如果你已经有了该格式的日期,你只需要调用&;< >强strtotime < / >强"函数。

$date = '22-09-2008';
$timestamp = strtotime($date);
echo $timestamp; // 1222041600

或在单行中:

echo strtotime('22-09-2008');

简短而简单。

我使用了以下格式: $presentDateTime = strtotime(date('Y-m-d H:i:s'));