strtotime() 将不存在的日期转换为另一个日期

发布于 2024-12-07 03:33:48 字数 292 浏览 0 评论 0原文

我正在根据用户输入的日期、月份和年份值构建时间戳。

假设用户输入了一些错误的值,并且日期是不存在的“31-02-2012”,那么我必须得到错误的返回。但这里将其转换为附近的另一个日期。准确地说:“02-03-2012”..

我不希望这种情况发生..

$str = "31-02-2012";
echo date("d-m-Y",strtotime($str)); // Outputs 02-03-2012

任何人都可以帮忙吗?如果日期不是原始日期,我不希望返回时间戳。

I am building a timestamp from the date, month and year values entered by users.

Suppose that the user inputs some wrong values and the date is "31-02-2012" which does not exist, then I have to get a false return. But here its converting it to another date nearby. Precisely to: "02-03-2012"..

I dont want this to happen..

$str = "31-02-2012";
echo date("d-m-Y",strtotime($str)); // Outputs 02-03-2012

Can anyone help? I dont want a timestamp to be returned if the date is not original.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

烟凡古楼 2024-12-14 03:33:48

您可以查看 checkdate

You might look into checkdate.

你丑哭了我 2024-12-14 03:33:48

这是因为 strtotime() 在使用 - 时遇到了麻烦,因为它们用于表示 -1 week 等短语...

尝试

$str = '31-02-2012';
echo date('d-m-Y', strtotime(str_replace('-', '/', $str)));

但是 31-02-2012 不是有效的英文格式,它应该是 02-31-2012


如果您的 PHP >= 5.3,您可以使用 createFromFormat

$str = '31-02-2012';
$d = DateTime::createFromFormat('d-m-Y', $str);
echo $d->format('d-m-Y');

That's because strtotime() has troubles with - since they are used to denote phrase like -1 week, etc...

Try

$str = '31-02-2012';
echo date('d-m-Y', strtotime(str_replace('-', '/', $str)));

However 31-02-2012 is not a valid English format, it should be 02-31-2012.


If you have PHP >= 5.3, you can use createFromFormat:

$str = '31-02-2012';
$d = DateTime::createFromFormat('d-m-Y', $str);
echo $d->format('d-m-Y');
对岸观火 2024-12-14 03:33:48

在使用 strtotime 之前,您必须检查该日期是否可能。 Strtotime 会将其转换为 unix 日期,这意味着它将使用自...以来的秒数。这意味着它将始终是一个日期。

You'll have to check if the date is possible before using strtotime. Strtotime will convert it to unix date meaning it will use seconds since... This means it will always be a date.

东北女汉子 2024-12-14 03:33:48

您可以解决此问题

<?php
$str = "31-02-2012";
$unix = strtotime($str); 
echo date('d-m-Y', $unix);
if (date('d-m-Y', $unix) != $str){
   echo "wrong";
}
else{
   echo date("d-m-Y", $unx);
}

,或者仅使用 checkdate()< /a>

You can workaround this behavior

<?php
$str = "31-02-2012";
$unix = strtotime($str); 
echo date('d-m-Y', $unix);
if (date('d-m-Y', $unix) != $str){
   echo "wrong";
}
else{
   echo date("d-m-Y", $unx);
}

or just use checkdate()

柠檬 2024-12-14 03:33:48

使用检查日期函数。

$str = "31-02-2012";
$years = explode("-", $str);
$valid_date = checkdate($years[1], $years[0], $years[2]);

Checkdate 函数 - PHP 手册 & 爆炸函数 - PHP 手册

Use the checkdate function.

$str = "31-02-2012";
$years = explode("-", $str);
$valid_date = checkdate($years[1], $years[0], $years[2]);

Checkdate Function - PHP Manual & Explode Function - PHP Manual

橘虞初梦 2024-12-14 03:33:48

结合 date_parse 和 checkdate 来检查它是否是有效时间。

<?php
date_default_timezone_set('America/Chicago');

function is_valid_date($str) {
    $date = date_parse($str);
    return checkdate($date['month'], $date['day'], $date['year']);
}

print is_valid_date('31-02-2012') ? 'Yes' : 'No';
print "\n";
print is_valid_date('28-02-2012') ? 'Yes' : 'No';
print "\n";

尽管根据 PHP 日期格式,该日期格式是可以接受的,它仍然可能会给日期解析器带来问题,因为很容易混淆月份和日期。例如,02-03-2012,很难判断 02 是月份还是日期。最好使用此处其他更具体的日期解析器示例首先解析日期,然后使用 checkdate 检查它。

Combine date_parse and checkdate to check if it's a valid time.

<?php
date_default_timezone_set('America/Chicago');

function is_valid_date($str) {
    $date = date_parse($str);
    return checkdate($date['month'], $date['day'], $date['year']);
}

print is_valid_date('31-02-2012') ? 'Yes' : 'No';
print "\n";
print is_valid_date('28-02-2012') ? 'Yes' : 'No';
print "\n";

Even though that date format is acceptable according to PHP date formats, it may still cause issues for date parsers because it's easy to confuse the month and day. For example, 02-03-2012, it's hard to tell if 02 is the month or the day. It's better to use the other more specific date parser examples here to first parse the date then check it with checkdate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文