【问题标题】:Error converting date to datetime将日期转换为日期时间时出错
【发布时间】:2014-06-18 00:32:53
【问题描述】:

我正在使用 jQuery datepicker 在我的输入日期中选择一个日期。

我在 datepicker 脚本中使用的格式是:dateFormat: 'DD, d MM, yy',

所以我在输入中得到了这个日期:“Quinta-feira, 1 Maio, 2014”(葡萄牙语日期)。

但现在我需要将此日期转换为在mysql中保存日期时间。

如果日期是英文,我只需要使用下面的代码:

$date = DateTime::createFromFormat('l, j F, Y', $_POST['date']);
echo $date->format('Y-m-d');    

但我的日期不是英文,所以我需要进行转换,我尝试使用下面的函数“convertDate”来做到这一点。

但是当我调用该函数时,我会像这样传递输入日期值:convertDate($_POST['date']);

我收到了一个错误在非对象上调用成员函数 format()$day= $date->format("l");

你发现这里有什么问题吗?因为这个功能对我来说似乎很好!

function convertDate($myDate){

        $date = DateTime::createFromFormat('Ymd', $myDate);
        $day    = $date->format("l");
        $daynum = $date->format("j");
        $month  = $date->format("F");
        $year   = $date->format("Y");

        switch($day)
        {
            case "Segunda-Feira":    $day = "Monday";  break;
            case "Terça-Feira":      $day = "Tuesday"; break;
            case "Quarta-Feira":     $day = "Wednesday";  break;
            case "Quinta-Feira":     $day = "Thursday"; break;
            case "Sexta-Feira":      $day = "Friday";  break;
            case "Sábado":           $day = "Saturday";  break;
            case "Domingo":          $day = "Sunday";  break;
            default:                 $day = "Unknown"; break;
        }

        switch($month)
        {
            case "Janeiro":    $month = "January";    break;
            case "Fevereiro":  $month = "February";   break;
            case "Março":      $month = "March";     break;
            case "Abril":      $month = "April";     break;
            case "Maio":       $month = "May";       break;
            case "Junho":      $month = "June";      break;
            case "Julho":      $month = "July";      break;
            case "Agosto":     $month = "August";    break;
            case "Setembro":   $month = "September"; break;
            case "Outubro":    $month = "October";   break;
            case "Novembro":   $month = "November";  break;
            case "Dezembro":   $month = "December";  break;
            default:           $month = "Unknown";   break;
        }

    echo $daynum . ", " . $month . ", " . $year;
}

尝试使用 str_ireplace:

$english = array("Segunda-Feira","Terça-Feira","Quarta-Feira","Quinta-Feira","Sexta-Feira","Sábado","Domingo");
$portuguese = array("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"); 
$result= str_ireplace ($english , $portuguese, $_POST['date']);
$date = DateTime::createFromFormat('l, j F, Y', $result);
echo $date->format('Y-m-d');

我在echo $date->format('Y-m-d') 中遇到了同样的错误

【问题讨论】:

  • var_dump($myDate) 告诉我们结果。
  • 我得到这个:"string(25) "Sexta-feira, 2 Maio, 2014"",这是我在日期选择器中选择的日期!
  • 您又回到了上一个问题中遇到的相同问题。该日期格式不适用于DateTime()(并且您在 createFromFormat 中的格式不正确)。我建议使用正则表达式将此日期字符串分解为您需要的部分。从那里你的代码的其余部分应该可以工作。

标签: php jquery mysql sql datetime


【解决方案1】:

您可以让 JQuery 将各种 UTC 放在隐藏的表单字段中,然后使用它来代替,而不是尝试用各种语言翻译日期:

这将返回一个 JS 日期对象:

   var currentDate = $( ".selector" ).datepicker( "getDate" );

这将从它生成一个 PHP UTC(在 JS 中是微秒...)

   var phputc = Math.ceil((currentDate.getTime()/1000));

这将以隐藏的形式放入:

   $(".selector" ).change(
        function()
        {
             var currentDate = $( ".selector" ).datepicker( "getDate" );
             var phputc = Math.ceil((currentDate.getTime()/1000));
             document.forms[0].nameofhiddenformfield.value = phputc;
        }
   );

确保您的表单中有这样的字段

   <input type="hidden" name="nameofhiddenformfield" />

然后在 PHP 端你可以这样做:

   $dateUTC = $_POST['nameofhiddenformfield'];
   echo date('Y-m-d',$dateUTC);

【讨论】:

  • 感谢您的解决方案,但奇怪的是我收到此错误:date() 期望参数 2 很长,输入字符串。当我执行 echo date('Ym-d',$dateUTC) ;
  • $dateUTC 的转储为空,如 "string(0)""
  • 很难说哪里出了问题。我发布的 jquery 函数工作正常(经过测试),但当然你应该分析和重现,而不仅仅是剪切和粘贴。您是否在表单中创建了隐藏的表单域? post变量发送到服务器好吗?
【解决方案2】:

您的方法是错误的,在函数的第一行中,您尝试将葡萄牙语日期转换为 Ymd 格式,因此您的 $date 对象一开始就有缺陷。

您可能应该做的(假设没有将葡萄牙语日期转换为 DateTime 的本地化函数...),使用字符串替换之类的东西将所有葡萄牙语单词替换为英语单词,然后使用您的原始转换:

$date = DateTime::createFromFormat('l, j F, Y', $translated_date);

所涉及的 17 / 34 字不会相互干扰,所以 str_ireplace() 应该有两个数组。

【讨论】:

  • 谢谢,这似乎是一个很好的解决方案,我不知道这个功能,但它似乎是一个很好的解决方案。但我遇到了与函数 convertDate() 相同的错误。
  • @OzzC 你也忘了加上月份。翻译后你应该做一个var_dump($result); 来验证它是你所期望的。
  • 谢谢你,我真的忘记了几个月!现在我认为我更接近了,但我有一个错误“可捕获的致命错误:不能将类 DateTime 的对象转换为我的 sql 行 $insertNews->bindValue(':date', $date); 中的字符串。但我已经使用DateTime::format 获取格式化字符串。你知道为什么会发生这个错误吗?
  • 好吧,我明白了,我解决了问题,执行 $newDate = $newDate->format('Y-m-d');。但是现在我的日期没有插入数据库,我现在需要理解为什么,但是这个问题的问题已经解决了,所以非常感谢你的想法!
猜你喜欢
  • 2014-10-13
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多