所以我正在抓取一个网站获取数据,而且我正在抓取的一个数据就是某些项目的日期。
商品的日期格式为“2015年3月11日星期三”。
我一直试图将其插入到我的mysql数据库中。数据库的结构包含一个“datapublished”为时间戳的列,
`feeddatapublished` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
当使用数据更新其余列时,使用以下代码
更新$stmt = $dbh->prepare("INSERT INTO `feedsdata` (`id`, `feedid`, `feedurl`, `feedsummary`, `feedtitle`, `feeddatapublished`) VALUES (NULL, :feed_id, :feed_url, :feed_summary, :title, :datapublished)");
$stmt->bindParam(':feed_id', $feed_id);
$stmt->bindParam(':feed_url', $feed_url);
$stmt->bindParam(':feed_summary', $feed_summary);
$stmt->bindParam(':title', $feed_title);
$stmt->bindParam(':datapublished',$datepublished);
$stmt->execute();
我在传递字符串之前将其转换为
$datepublished = strtotime(scrape_between($separate_result, "<span class=\"date\">", "</span>"));
scrape_between是我用于抓取的功能。
当回显$ datepublished时,我得到时间戳1458155700,这不是我能看到的正确时间戳。
所有其他列都根据需要进行更新,唯一的isnt是datepublished one。
我的两个问题是
答案 0 :(得分:1)
MySQL timestamp
格式为2016-02-13 15:48:29
或Y-m-d H:i:s
首先将您的unix timestamp
转换为该格式,然后MySQL会接受它。
使用
<?php
$datapublished = date("Y-m-d H:i:s", strtotime(scrape_between($separate_result, "<span class=\"date\">", "</span>")));
OR
您的查询
$stmt = $dbh->prepare("INSERT INTO `feedsdata` (`id`, `feedid`, `feedurl`, `feedsummary`, `feedtitle`, `feeddatapublished`)
VALUES (NULL, :feed_id, :feed_url, :feed_summary, :title, from_unixtime(:datapublished))");
答案 1 :(得分:0)
如果您知道您正在抓取的网页上使用的日期格式并保持不变,则可以使用DateTime::createFromFormat()
进行更安全,更受控制的日期解析。
<?php
$datestring = "Wed 11th March, 2015";
$date = DateTime::createFromFormat("D dS F, Y", $datestring);
// Reset hours, minutes and seconds - otherwise the current time is used
$date->setTime(0, 0, 0);
// Format for MySQL database insertion
$datepublished = $date->format("Y-m-d H:i:s");
答案 2 :(得分:0)
问题是strtotime
不够聪明,无法识别字符串,因此最佳猜测是1458155700。
您可以添加额外的步骤来清理日期:
$scrape = scrape_between(...);
$cleanDate = preg_replace(
'/[a-z]+ ([0-9]{1,2})[a-z]+ ([a-z]+), ([0-9]{4})/i',
'$1 $2 $3',
$scrape
);
$datepublished = strtotime($cleanDate);
preg_replace
函数使用正则表达式删除不必要的部分。