【问题标题】:Process Array and change date format处理数组并更改日期格式
【发布时间】:2019-04-15 15:19:36
【问题描述】:

我之前问了一个问题,但意识到我问错了。我有一个采用以下格式的数组

Array
(
    [0] => Array
        (
            [ID] => 10000
            [Date] => 21/11/2013
            [Total] => 10
        )
    ...
)

所以它有一个 ID、Date 和 Total。一个问题是,我不知道 Date 列可能是什么格式,但无论是什么格式,我都需要将其转换为 dmy 格式。

所以我正在循环我的数组,我知道键永远是日期。

foreach($this->csvData as $item) {
    foreach($item as $key => $value) {
        if($key === 'Date') {
            $item[$key][$value] = date("dmy", strtotime($value));
        }
    }
}

我在上面遇到了几个问题。首先,在循环之后,如果我输出$this->csvData,则日期值尚未转换为新值。我知道我在正确的地方,因为如果我在 if 中这样做

print_r(date("dmy", strtotime($value));

我可以看到更改的日期。我不认为我重新分配它们是正确的吗?

我正在尝试做的另一件事是这个。如果日期完全错误,说一些随机的东西,比如23455,然后我想从数组中删除整个元素。

这可能吗?我知道验证日期,但它似乎总是针对一种特定格式进行验证,而我不知道格式是什么。

谢谢

【问题讨论】:

  • 参考foreach($this->csvData as &$item)
  • 我遇到了一个格式不正确的数值
  • 你应该这样做 $item[$key] = date("dmy", strtotime($value)); - 没有额外的 $value 索引
  • 您收到此异常可能是因为strtotime() 无法将$value 转换为时间格式。

标签: php arrays date


【解决方案1】:

您的问题在于 dd/mm/yyyy 格式。

来自strtotimedocumentation

m/d/y 或 d-m-y 格式的日期可以通过查看来消除歧义 各个组件之间的分隔符:如果分隔符是 斜线 (/),则假定为美式 m/d/y;而如果 分隔符是破折号 (-) 或点 (.),然后是欧洲 d-m-y 格式 假设。但是,如果年份以两位数格式给出,并且 分隔符为破折号 (-),日期字符串被解析为 y-m-d。

为避免潜在的歧义,最好使用 ISO 8601 (YYYY-MM-DD) 日期或 DateTime::createFromFormat() 尽可能。

所以"21/11/2013" 失败,因为没有第 21 个月...

- 用作"21-11-2013"

如果不知道格式可以先查看strtotime的返回值:

$arr = [["id" => 100, "data" => "21-11-2013"]];

foreach($arr as $k => &$e) {
    $val = strtotime($e["data"]) ? strtotime($e["data"]) : strtotime(str_replace("/", "-", $e["data"]));
    $e["data"] = date("m/d/y", $val);
    if (!$val) unset($arr[$k]); // if non valid date remove from array
}

现场示例:3v4l

【讨论】:

  • 他说“一个问题是,我不知道日期列可能是什么格式”,所以我认为他不能随心所欲地改变他的数组。
  • 我实际上刚刚遇到了这个问题。问题是,我不知道日期可能是什么格式。这个数据集使用正斜杠,另一个可能使用连字符。我可以检测到它还是什么/
  • 谢谢。这完美:-) 有没有办法测试日期是否完全错误,并从数组中删除整个元素?
猜你喜欢
  • 2021-08-25
  • 2010-10-12
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多