首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在assoc数组中爆炸日期/时间字符串

在assoc数组中爆炸日期/时间字符串
EN

Stack Overflow用户
提问于 2012-09-29 15:09:00
回答 4查看 3.5K关注 0票数 0

我有一个从DB选项返回的字符串,允许用户设置她/他的日期格式:

代码语言:javascript
运行
复制
F j, Y

然后在我的get_date()函数中返回以下值:

代码语言:javascript
运行
复制
string 'September 24, 2012' (length=18)

现在,我需要一个分割该字符串的关联数组:

代码语言:javascript
运行
复制
array( 
    'day'   => 24,
    'month' => 'September',
    'year'  => 2012
)

由于不知道用户如何设置她/他的日期,我有一个问题,我不能简单地说F = month, j = day, Y = year function允许的所有内容都允许在系统中使用。

问题:如何“匹配”这些?是否有我监督过的本机函数,它告诉我某物是否是一个月/日/年/小时/小时?

编辑:的最大值。我可以使用的PHP版本是PHP5.2.1

EN

回答 4

Stack Overflow用户

发布于 2012-09-29 15:13:28

如果您有PHP5.3或更高版本,请使用DateTime::createFromFormat

代码语言:javascript
运行
复制
$date = DateTime::createFromFormat($inputFormat, $gotDate);

$result = array(
    'day' => (int)$date->format('j'),
    'month' => $date->format('F'),
    'year' => (int)$date->format('Y')
);
票数 4
EN

Stack Overflow用户

发布于 2012-09-29 15:13:02

在我看来,首先不应该将该字符串存储在数据库中,而是使用时间戳。

如果你这样做了,你可以使用这样的东西:

代码语言:javascript
运行
复制
$dateTime = new DateTime($theTimestamp);
$date = array(
    'day' => $dateTime->format('j'),
    'month' => $dateTime->format('F'),
    'year' => $dateTime->format('y'),
);

如果希望在数组中灵活处理所需内容,则可以创建如下所示的函数:

代码语言:javascript
运行
复制
function buildDateArray($theTimestamp, $elements) {
    $dateTime = new DateTime($theTimestamp);
    $date = array();
    foreach($elements as $key => $format) {
        $date[$key] = $dateTime->format($format);
    }
}

$theArray = buildDateArray($theTimestamp, array(
    'day' => 'j',
    'month' => 'F',
    'year' => 'y',
));

注:DateTime可在5.2.0时使用

票数 1
EN

Stack Overflow用户

发布于 2012-09-30 18:32:45

正如您现在所写的,您手头没有PHP5.3(真的很遗憾),所以您需要解析字符串“手动”。除了PCRE正则表达式之外,还有sscanf。示例:

代码语言:javascript
运行
复制
$date = 'September 24, 2012';
$result = sscanf($date, '%s %2d, %4d', $month, $day, $year);
$parsed = array(
    'day'   => $day,
    'month' => $month,
    'year'  => $year
);
var_dump($parsed);

输出:

代码语言:javascript
运行
复制
array(3) {
  'day' =>
  int(24)
  'month' =>
  string(9) "September"
  'year' =>
  int(2012)
}

这将根据您的格式解析输入日期字符串。如果您需要这种更灵活的方法,则需要动态构建模式,并将值与结果数组相关联。

我已经编写了另一个例子来实现这一点。它可能有点脆弱(我增加了一些注释),但它确实有效。当然,我会将它包装成一个函数--更好地处理错误条件--但是我保留了原始代码,以便更好地展示它是如何工作的:

代码语言:javascript
运行
复制
// input variables:
$date = 'September 24, 2012';
$format = 'F j, Y';

// define the formats:
$formats = array(
    'F' => array('%s',  'month'),  # A full textual representation of a month, such as January or March
    'j' => array('%2d', 'day'),    # Day of the month, 2 digits with or without leading zeros
    'Y' => array('%4d', 'year'),   # A full numeric representation of a year, 4 digits
    # NOTE: add more formats as you need them
);

// compile the pattern and order of values
$pattern = '';
$order = array();
for($l = strlen($format), $i = 0; $i < $l; $i++) {
    $c = $format[$i];

    // handle escape sequences
    if ($c === '\\') {
        $i++;
        $pattern .= ($i < $l) ? $format[$i] : $c;
        continue;
    }

    // handle formats or if not a format string, take over literally
    if (isset($formats[$c])) {
        $pattern .= $formats[$c][0];
        $order[] = $formats[$c][1];
    } else {
        $pattern .= $c;
    }
}

// scan the string based on pattern
// NOTE: This does not do any error checking
$values = sscanf($date, $pattern);

// combine with their names
// NOTE: duplicate array keys are possible, this is risky,
//       write your own logic this is for demonstration
$result = array_combine($order, $values);

// NOTE: you can then even check by type (string/int) and convert
//       month or day names into integers

var_dump($result);

在这种情况下,结果是:

代码语言:javascript
运行
复制
array(3) {
  'month' =>
  string(9) "September"
  'day' =>
  int(24)
  'year' =>
  int(2012)
}

注意笔记。在我编写它之前,我已经检查了PHP手册中的用户注释,但是这里提供的函数只用于解析一种特定的模式,而这个变体应该在一定程度上是可扩展的。如果您只有这一种格式,那么您可以自然地非动态地创建sscanf字符串。

另见:format equivalent for PHP 5.2 (or lower)

还要注意,由于这是wordpress,月份名称可能会被翻译。

我很肯定你也能得到一个时间戳格式的帖子的日期。对于一个插件来说,仅仅基于post ID来提供这个值而不是解析一些字符串可能会减少一些负担。

最后请注意:只有Wordpress有一个最低的PHP版本,这不一定意味着您的插件需要精确的最低版本,也。特别是在您概述的情况下,PHP5.2不再得到任何支持(它已经死了),您可以帮助插件用户告诉他们应该更新他们的PHP版本。

看起来Wordpress仍然没有给出关于PHP版本的警告,他们停止使用浏览器和他们自己的软件;)没有必要模仿这种糟糕的做法。告诉你的用户,他们处于危险之中,并把他们吓出地狱(或做闪亮的弹出泡泡,以一种不那么危险的方式获得信息。)为你的用户做一个善意的服务,然后有一些东西为双方赢得,做一些优雅的退步,以显示你的良好态度)。

另见:Is there a Wordpress version that is incompatible with PHP 5.3?

如果您感兴趣,可以在PHP.net:https://wiki.php.net/rfc/releaseprocess上找到当前的PHP发布周期。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12653859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档