Re: date(n/Y) strtotime

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Mark Steudel wrote:
In the strtotime notes, it says that strtotime returns -1 previous to
php5, but if I do:

If( strtotime( '1/2009') == -1 )
{
Echo 'false';
}
Else
{
Echo 'true';
}

If( strtotime( '1/2009') === -1 )
{
Echo 'false';
}
Else
{
Echo 'true';
}

If( strtotime( '1/2009') == '-1' )
{
Echo 'false';
}
Else
{
Echo 'true';
}


All of those echo true, how do I determine if strtotime has failed or
not?

Mark
-----Original Message-----
From: Mark Steudel Sent: Wednesday, August 02, 2006 9:55 AM
To: Mark Steudel; PHP Mailing Lists
Subject: RE:  date(n/Y) strtotime

Ok so actually I didn't solve it. Php5, this works, but php 4.4.1 and
4.4.0 don't handle this correctly. Here's my code I'm running on each
box:

function expDate2str( $date )
{
	if( !($sDate = strtotime( $date ) ) )
	{
		echo "Invalid, blowing up date<br />";
		
		// exploded date
		$eDate = explode( '/', $date );
		
		// string date
		$sDate = strtotime( date( "Y-m-d", mktime( 0, 0, 0,
$eDate[0], 1, $eDate[1] ) ) );
	}
else {
		echo "valid<br/>";
	}
	echo "In: " .$date ."<br />Out: ". date( "Y-m-d", $sDate ) ."<br
/><br />";
}

expDate2str('1/2009');
expDate2str( date( "n/Y"));


Here are the results:

Php 5.1.2

Invalid, blowing up date
In: 1/2009
Out: 2009-01-01

Invalid, blowing up date
In: 8/2006
Out: 2006-08-01

PHP 4.4.1

Valid
In: 1/2009
Out: 2011-07-02

Valid
In: 8/2006
Out: 2012-01-27

PHP 4.4.0
Valid
In: 1/2009
Out: 2011-07-02

Valid
In: 8/2006
Out: 2012-01-27

Any work around with these types of dates on php4?

Mark
-----Original Message-----
From: Mark Steudel Sent: Wednesday, August 02, 2006 9:46 AM
To: PHP Mailing Lists
Subject:  date(n/Y) strtotime

I've always been really amazed at how well strtotime works, but recently
ran into an issue where it couldn't figure out the date if it was a cc
exp date in long format, e.g. 1/2009. I was curious if anyone else has
run into this and how did they get around it, here was my solution:

function expDate2str( $date )
{
	if( !($sDate = strtotime( $date ) ) )
	{
		// exploded date
		$eDate = explode( '/', $date );
		
		// string date we hard code the day to 1
		$sDate = strtotime( date( "Y-m-d", mktime( 0, 0, 0,
$eDate[0], 1, $eDate[1] ) ) );
		
		
	}
	
	return $sDate;
}

Thanks, Mark

--------------------------------------------------------------
Mark Steudel
Web Applications Developer
555 Dayton St Suite A
Edmonds, WA 98020
p: 425.741.7014
e: mark@xxxxxxxxxxxx
w: http://www.netriver.net


Did you try my code? It's a lot simpler than yours, faster too. And I just tried executing it to confirm that it works.

The problem with your comparison is that strtotime thinks the date is invalid, but misinterprets it. But since once you decide the date is invalid you assume it's in a given format, it is enough to simply check that it's in the certain format to begin with. I don't know how complex you want to get with this, here's a relatively simple if statement to do the check:

if ( 6 <= strlen($date) <= 7 && substr_count($date, "/") == 1 )

Which checks that the length is from our credit card strings, and that it looks somewhat valid (You could go more in depth in checking, but this'll do for now).

Now, that new comparison would be needed for your code, but I'll rewrite your function to use my simpler method of conversion:

<?php

function expDate2str($date)
{
	$datelen = strlen($date);
	if ( ($datelen == 6 || $datelen == 7) && substr_count($date, "/") == 1 )
	{
		echo "Invalid, blowing up date<br/>";
$sDate = strtotime(str_replace("/", "/01/", strlen($date) == 6 ? "0$date" : $date));
	}
	else
	{
		echo "valid<br/>";
	}
	echo "In: $date<br/>Out: ". date( "Y-m-d", $sDate ) ."<br/><br/>";
}

expDate2str('1/2009');
expDate2str( date( "n/Y"));

?>

Which when I run it (in PHP 4 though) prints out this:

Invalid, blowing up date
In: 1/2009
Out: 2009-01-01

Invalid, blowing up date
In: 8/2006
Out: 2006-08-01

For the heck of it, here's a more production-oriented version of the function/test script:

<?php

function expDate2str($date)
{
	$datelen = strlen($date);
	if ( ($datelen == 6 || $datelen == 7) && substr_count($date, "/") == 1 )
return date("Y-m-d", strtotime(str_replace("/", "/01/", strlen($date) == 6 ? "0$date" : $date)));
	else
		return date("Y-m-d", $date);
}

echo expDate2str('1/2009');
echo "<br/>";
echo expDate2str( date( "n/Y"));

?>

Regards, Adam Zey.

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux