【问题标题】:Create Datetime object from string从字符串创建日期时间对象
【发布时间】:2015-06-04 14:36:22
【问题描述】:

我遇到需要从字符串创建日期时间对象的情况。 当我在表示日期的字符串的模式上没有一致性时,就会出现问题。 这些是我的数据示例:

07/17/2012
2013/03/11
17/05/2015
17/17/2015

如您所见,最后一个无论如何都无效,因为没有 17 个月,但前 3 个有效取决于月份位置(当然还有年份)

我的问题:有没有办法(通过正则表达式很确定)来创建一个以日期字符串作为参数的函数,返回 datetime 对象。如果字符串无效,则返回:1/1/1970...

【问题讨论】:

  • 2015 年 4 月 6 日这样的模棱两可的日期呢?
  • 您必须想出一个解决方案,让您的程序如何区分不同的格式。
  • 例如:统计第一个'/'之前的字符数。如果是 4,你知道它的年份。

标签: php string datetime


【解决方案1】:

当我在表示日期的字符串的模式上没有一致性时,问题就出现了

为此,php提供strtotime():http://php.net/manual/en/function.strtotime.php

示例用法:

   $str1 = "2015-06-04 16:00";
   $str2 = "06/04/2015 4 pm";
   $str3 = "04.06.2015 16:00";

   $actualDate = date("Y-m-d H:i:s", strtotime($str1));
   echo $actualDate."<br />";
   $actualDate = date("Y-m-d H:i:s", strtotime($str2));
   echo $actualDate."<br />";
   $actualDate = date("Y-m-d H:i:s", strtotime($str3));
   echo $actualDate."<br />";

   //all will produce "2015-06-04 16:00:00"

作为奖励,strtotime 还支持“疯狂”的表达方式,例如

$actualDate = date("Y-m-d H:i:s", strtotime("06/04/2015 + 1 day - 8 hours")); 
echo $actualDate."<br />";
// "2015-06-04 16:00:00"

还有更多,例如“本周星期一”、“下周星期二”、“2038 年 1 月的第一个星期一”等。

【讨论】:

    【解决方案2】:

    您可以尝试使用您的字符串值创建 DateTime 对象。如果日期格式无效,它会抛出异常,然后你可以抓住它并返回你的 1/1/1971

    try {
        $dateTime = new DateTime('17/17/2015');
        return $dateTime;
    } catch (Exception $e) {
       return '1/1/1971';
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用DateTime

      $myDate = '17/17/2015';
      
      $date = DateTime::createFromFormat('d/m/Y', $myDate);
      
      if (DateTime::getLastErrors()['warning_count'] >= 1) {
          // Invalid
      } else {
          // Valid date
      }
      

      【讨论】:

      • 问题是我不能确定这个格式:'d/m/Y' in createFromFormat('d/m/Y', $myDate) 看看数据示例
      • 那你可以用strtotime吗?
      • 如果您允许完全自定义日期,您总会遇到问题。例如,2015 年 1 月 2 日可能是 2 月 1 日或 1 月 2 日。
      猜你喜欢
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多