2

我是一名 PHP 初学者,并且一直在努力使用 php 文档,但没有成功。似乎有很多方法可以做我想做的事。

基本上我需要一个 php 页面来检查附加到 URL 的“丑陋”日期/时间变量 - 它必须将其转换为可用格式并从当前日期/时间中减去它。如果结果少于 48 小时,则页面应重定向到“页面 A”,否则应重定向到“页面 B”

这就是 URL 和变量的样子。

http://mysite.com/special-offer.php?date=20130527212930

$date 变量是 YEAR,MONTH,DAY,HOUR,MINUTE,SECOND。我无法更改此变量的格式。

我猜 PHP 不能按原样使用该字符串。所以我需要以某种方式将其拆分为 PHP 可以使用的日期格式。然后从当前服务器日期/时间中减去它。

然后根据结果是多于还是少于 48 小时将结果放入 if/else 中。

我在理论上是对的吗?谁能帮我“练习”?

谢谢!

4

5 回答 5

8

看一下 DateTime 类,特别是createFromFormat方法(php 5.3+):

$date = DateTime::createFromFormat('YmdHis', '20130527212930');
echo $date->format('Y-m-d');

您可能需要根据前导零的使用来调整格式。

于 2013-06-05T02:22:24.970 回答
2

PHP 5 >= 5.3.0

$uglydate = '20130527212930';

// change ugly date to date object
$date_object = DateTime::createFromFormat('YmdHis', $uglydate);

// add 48h
$date_object->modify('+48 hours');

// current date
$now = new DateTime();

// compare dates
if( $date_object < $now ) {
    echo "It was more than 48h ago";
}
于 2013-06-05T02:47:44.133 回答
1

哇!你们都有太多时间在手...很好的答案...哦,好吧,我会弹出一个完整的解决方案...

<?php

$golive = true;

if (preg_match('|^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})|', $_GET['date'], $matches)) {

    list($whole, $year, $month, $day, $hour, $minute, $second) = $matches;

    // php: mktime function (using parameters derived
    $timestamp = mktime($hour,$minute,$second,$month,$day,$year);

    $diff = time()-$timestamp;
    $diffInHours = $diff / 3600 ;

    // if less, than 48
    if ( $diffInHours < 48 ) {
        $location = "http://bing.com";
    } else {
        $location = "http://google.com";
    }

    //
    if ( $golive ) {
        header("Location: ".$location);
        exit();
    } else {
        echo "<p>You are would be sending the customer to:<br><strong>$location</strong>";
    }

} else {

    echo "<p>We're not sure how you got here, but... 'Welcome!'???</p>";

}

那应该做。

顺便说一句,另一方面,我强烈建议您返回该 URL 的发送方,并明确重新考虑如何完成此操作。由于这很容易调整(URL 日期 = 值),因此并不能真正保护任何东西,而只是将钥匙放在“安装在这所房子的监护人警报”{sign} 旁边的前廊上 :)。

于 2013-06-05T02:41:30.527 回答
1

您可以使用正则表达式来读取您的字符串并构造一个有意义的值。

例如

$uglydate = "20130527212930";
preg_match("/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/", $uglydate, $matches);

$datetime = $matches[1] . "-" . $matches[2] . "-" . $matches[3] . " " . $matches[4] . ":" . $matches[5] . ":" . $matches[6];

//then u can use $datetime in functions like strtotime etc
于 2013-06-05T02:22:41.470 回答
0

假设输入格式正确(正确的字符数和所有数字),您将需要 1 个长度为 4 的子字符串,其余长度为 2。为简单起见,我将忽略前 2 个字符来自2013 ) 与substr

$input=substr($input, 2, strlen($input));

现在我可以将字符串中的所有剩余元素视为 2 字符对:

$mydate=array(); //I'll store everything in here
for($i=0; $i<=strlen($input)-2; $i+=2){
    $mydate[$a]=substr($input, $i, $i+2);
    $a++;
}

现在我在索引从 0 到 5 的数组中有年、月、日等。对于日期差异,我将把数组放入mktime

$timestamp = mktime(mydate[3], mydate[4], mydate[5], mydate[1], mydate[2], mydate[0]);

最后比较两个时间戳:

if($old_ts - $timestamp > (60*60*48)){
//more than 48 hours
}else{ ... }
于 2013-06-05T02:34:52.680 回答