22-09-2008
?#1 楼
该方法在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 楼
还有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);
评论
它应该是tm_mon而不是tm_month和tm_mday而不是tm_day
– amarillion
09年5月15日在11:32
注意,strptime功能在Windows上不可用。
–叠底
2010年5月29日在12:03
Windows和PHP 5.3.0+上的版本,请考虑使用date_parse_from_format而不是strptime。
–欧文·韦塞尔斯
2013年6月25日9:56
...因为strptime未在Windows平台中实现。
–兰德尔
2015年5月7日在7:21
由于这是一个极受好评的答案,您是否会考虑将其编辑为在Windows的PHP以及unixen上都可以使用的答案?恕我直言,理想情况下,它应该提到时区。
–法尔肯教授
5月13日14:44
#3 楼
使用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。
评论
如今,我会在我的答案中推荐这个。
–直到
2012年1月11日在16:47
Arggg。 !别忘了!我的基于日期的时间戳在每次刷新时都在变化,这让我发疯-因为DateTime有用地添加了当前时间,而没有询问或告知。 rr
–user672739
18年6月8日在8:40
我想补充一点,我建议不要进行模棱两可的日期解析,并且在解析日期字符串时应明确给出日期格式。
–法尔肯教授
5月13日14:57
#4 楼
请小心使用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提供的解决方案。评论
有效的关注。我猜strtotime()依赖于您的语言环境。
–直到
08/09/23在9:17
注意:在大多数非英语国家/地区,格式为dd-mm-yyyy,而不是mm-dd-yyyy。
–卡米洛·马丁(Camilo Martin)
2010-12-11 22:49
@CamiloMartin大多数非英语国家/地区使用您指定的第一种格式,但数据库通常将日期存储在YYYY-mm-dd中。转换仅会显示给用户
– Danny22
2014年9月15日15:24
@DannyG只是看了看文档,如果按DB的意思是MySQL,这似乎是正确的。但是这样做似乎很荒谬...
–卡米洛·马丁(Camilo Martin)
2014年9月15日在17:51
#5 楼
该方法在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)
15年4月13日在13:46
#6 楼
使用mktime:list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
评论
那就是我一直在做的。 -或/或将其爆炸。或任何分离的内容,然后是mktime。
–富有的布拉德肖
08/09/22在17:25
在PHP手册中,有一个关于mktime函数的最后一个参数的注释:“从PHP 5.1.0开始,不推荐使用此参数。因此,应改用新的时区处理功能。”我还没有发现他们所说的新功能是什么,因为它们还没有链接!
–高度不规则
2012年1月11日1:00
这远优于strtotime()出于某种原因,strtotime()在某些日期不起作用,因此非常不可靠。
– dspacejs
15年5月16日在6:21
#7 楼
使用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()付出什么,它都会使最好是猜测。该猜测可能是不正确的,但是您不会得到任何错误猜测的迹象。这是一支步枪。如果愿意,可以使用它,但是新手用户可以使用我认为的警告。注意:前脚枪
–法尔肯教授
5月13日14:41
#8 楼
这是使用split
和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
16 Dec 19'在12:37
#9 楼
鉴于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']);
评论
注意:使用strtotime():分隔符为斜杠(/),则假定使用美国m / d / y;相反,如果分隔符是破折号(-)或点(。),则采用欧洲d-m-y格式。所以我认为不需要使用strptime()
–secretlm
2013年6月21日6:09
#10 楼
如果您想确定日期是否可以解析为期望的值,可以使用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日,具体取决于您来自哪里:) 评论
DateTime :: createFromFormat在错误时返回false,而不是null。
– mpen
2014年12月24日,0:09
#11 楼
如果您知道格式,请使用strptime
,因为strtotime
会对格式进行猜测,但不一定总是正确的。由于Windows中未实现strptime
,因此存在自定义函数http://nl3.php.net/manual/zh-CN/function.strptime.php#86572
请记住,返回值
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)
#12 楼
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
http://php.net/manual/en/function.date.php
#13 楼
$time = '22-09-2008';
echo strtotime($time);
#14 楼
使用PHP函数strtotime()
echo strtotime('2019/06/06');
date —格式化本地时间/日期
评论
他说,日期是时间戳,而不是日期
–塞缪尔·彼得罗(Samuel Petrosyan)
19年2月24日在20:11
现在检查。
– Gurpreet Singh
19年2月28日在10:07
#15 楼
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
#16 楼
<?php echo date('U') ?>
如果需要,可以将其放入MySQL输入类型的时间戳中。上面的方法非常有效(仅在PHP 5或更高版本中):
<?php $timestamp_for_mysql = date('c') ?>
#17 楼
这是我的处理方法: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'];
这样,您可以让函数知道您使用的日期格式,甚至指定时区。
#18 楼
如果将其设置为在数据库中保存日期,请注意时间/区域,因为当我比较使用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)
#19 楼
如果您希望将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);
评论
优雅。我已经忘记了!
–直到
08年9月22日在8:49
您怎么还没有得到这个答案的称号?
–马克·汤姆林
2010年6月13日在13:09
一个完全有效的答案,但令我惊讶的是Armin Ronacher的答案在投票中没有与之匹配-模棱两可总是不好的。
–RonLugge
13年5月5日在5:40
@Devner嗯,看来在我的服务器上不支持该格式。也许与您的有所不同。
–卢卡斯
13年4月22日在0:05
此解决方案可能导致意外的行为。使用PHP 5.3+的用户应该采用Falken教授的答案,在该答案中,您可以完全控制日期格式。
–卢卡·法乔利(Luca Fagioli)
2015年4月13日在20:22