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


Answers:


612


这种方法适用于这两个 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。(与“ 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 2010年

4
一个完全有效的答案,但令我惊讶的是Armin Ronacher的答案在投票中没有与之匹配-模棱两可总是不好的。
RonLugge

1
@Devner好吧,似乎在我的服务器上不支持该格式。也许与您的有所不同。
卢卡斯

1
此解决方案可能导致意外的行为。使用PHP 5.3+的用户应该采用Falken教授的答案,在该答案中,您可以完全控制日期格式。
卡·法乔利

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_mon而不是tm_month和tm_mday而不是tm_day
amarillion

68
注意,strptime功能在Windows上不可用。
understack

12
Windows和PHP 5.3.0+上的版本,请考虑使用date_parse_from_format代替strptime
Erwin Wessels 2013年

1
...因为strptime未在Windows平台中实现。
兰德尔2015年

既然这是一个投票率很高的答案,您是否会考虑将其编辑为在Windows的PHP以及unixen上都可以使用的答案?恕我直言,理想情况下,它应该提到时区。
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');

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

另一个选择是使用IntlDateFormatterAPI:

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

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


15
如今,我会在我的答案中推荐这个。
直到2012年

Arggg。!不要忘记! 每次刷新都会更改基于日期的时间戳,这会让我发疯-因为DateTime会在不询问或不告知的情况下帮助添加当前时间。rr

我想补充一点,我建议不要对模棱两可的日期进行解析,并且在解析日期字符串时应明确给出日期格式。
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
卡米洛·马丁

1
@CamiloMartin大多数非英语国家/地区使用您指定的第一种格式,但数据库通常将日期存储在YYYY-mm-dd其中。转换仅会向用户显示
Danny22

@DannyG只是看了看文档,如果按DB的意思是MySQL,这似乎是正确的。但是这样做似乎很荒谬……
Camilo Martin

57


这种方法适用于这两个 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。(与“ 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
在PHP手册中,有一个关于mktime函数的最后一个参数的注释:“从PHP 5.1.0开始,不推荐使用此参数。因此,应改用新的时区处理功能。” 我还没有发现他们谈论的新功能是什么,因为它们还没有链接!
高度不规则的2012年

这要比strtotime()由于某些原因strtotime()在某些日期无法正常运行而要好得多,因此非常不可靠。
dspacejs,2015年

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/zh/function.strtotime.php

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


对于未来的读者-strtotime()是一个意外,不应该鼓励使用它。这是模棱两可的,因为它试图猜测日期格式。即使正确使用它,它也使您的代码更难以理解和推理,并且冒着对代码库进行更改的风险,这会引入错误,因为无论您对strtotime()付出什么,它都会使最好是猜测。该猜测可能是不正确的,但是您不会得到任何错误猜测的迹象。这是一支步枪。如果愿意,可以使用它,但是新手用户可以使用我认为的警告。警告:前进的步枪
Falken教授的合同

12

这是使用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);

对我来说,它就像是一种魅力。


请注意,split()现在已被弃用,但是如果您使用的是ol'php版本,那么它的效果很好!
雨果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-2008取决于您来自哪里,可能是4月3日或3月4日:)


1
DateTime::createFromFormat 返回false错误,不是null
mpen 2014年

5

如果您知道该格式的使用,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)




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

如果将时间/区域设置为在数据库中保存日期,请注意时间/区域,因为当我比较从mysql转换为timestampusing的日期时遇到问题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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.