TP使用phpexcel获取Excel表中的时间格式的数据,时间、日期格式转换成时间戳

最近因为项目需要,使用到了Excel表数据上传,遇到了一个让我非常头疼的问题,那就是excel表中的数据格式是日期、时间格式。而phpexcel只能获取文本格式的数据,其他类型的数据会自动转成文本型的,例如:


Paste_Image.png

这是个时间格式的数据,phpexcel获取到了之后数据变成


Paste_Image.png

它会自动转换成这个奇怪的数字!!!查阅了很多资料才知道这个数字其实意思是代表1970年1月1日过后的天数,5:00:00这个转换之后就相当于1970年1月1日过去了 0.208333333333333 天(被四舍五入了,excel格式转换的时候只能显示15位,不信的话可以用这个数字*24*3600 = 5*3600,相差一秒是因为excel自动做了四舍五入,这个问题下面会讲到)

<b>这是时间格式转换遇到的问题,下面说一说解决方案。</b>
时间格式的数据在php中获取到的都是上面说的那个很奇怪的数据,我总结了2中解决方法:
1、直接将获取到的数字*24*3600 就是秒数,这个最简单但是有一个很大的缺陷,就是秒数可能会相差一秒,对精度要求比较高的不推荐使用。以下是在thinkphp中的使用代码:

      $relative_url      = "./Public/upload/2017-02-10/589d25bedf17d.xlsx"//文件地址
      $excel               =    \PHPExcel_IOFactory::load($relative_url);//读取excel文件
      $excel->setActiveSheetIndex(0);
      $sheet0             =  $excel->getSheet(0);
      $date                 =  trim((string)$sheet0->getCell('D2')->getValue());//取D列2行的数据
      $date_seconds  = $date*24*3600;//转换成秒数
      $final_date        = date('H:i:s',$date_seconds);//转换成时分秒格式

2、利用phpExcel提供的转换函数(\PHPExcel_Shared_Date::ExcelToPHP)将获取到的数据转换成时间戳格式,这个函数会自动进位,这样转换出来的数据会精确到秒,这也是我在使用的方法。以下是在thinkphp中的使用代码:

      $relative_url      = "./Public/upload/2017-02-10/589d25bedf17d.xlsx"//文件地址
      $excel               =    \PHPExcel_IOFactory::load($relative_url);//读取excel文件
      $excel->setActiveSheetIndex(0);
      $sheet0             =  $excel->getSheet(0);
      $date                 =  trim((string)$sheet0->getCell('D2')->getValue());//取D列2行的数据
      $stamp_date      = \PHPExcel_Shared_Date::ExcelToPHP($date);//将获取的奇怪数字转成时间戳,该时间戳会自动带上当前日期
      $final_date        = gmdate("H:i:s",$stamp_date);//这个就是excel表中的数据了,棒棒的!

讲解一下,\PHPExcel_Shared_Date::ExcelToPHP这个方法是在ThinkPHP\Library\Vendor\PHPExcel\Shared\Date.php文件中,有兴趣的小伙伴可以自己去研究一下这个方法。(PS:前面加一个斜杠是因为tp中的命名空间的问题)

<b>另附上日期格式转换方法</b>

  error_reporting(E_ALL);
  date_default_timezone_set('Asia/shanghai');
  /** PHPExcel_IOFactory */
  require_once '../Classes/PHPExcel/IOFactory.php';
  $inputFileName = '6081076641077444758.xls';
  $objReader = new PHPExcel_Reader_Excel5();
  $objPHPExcel = $objReader->load($inputFileName);
  $sheet = $objPHPExcel->getSheet(0);
  $highestRow = $sheet->getHighestRow(); // 取得总行数
  $highestColumn = $sheet->getHighestColumn(); // 取得总列数
  $tempArray = array();
  for($j=2;$j<=$highestRow;$j++){
     for($k='A';$k<=$highestColumn;$k++){ 
      if($k=='M'||$k=='O') //M列和O列是时间
          $tempArray[] = excelTime($objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue());
      else
          $tempArray[] = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
      }
      print_r($tempArray);
      unset($tempArray);
  }

  function excelTime($date, $time = false) {
      if(function_exists('GregorianToJD')){
          if (is_numeric( $date )) {
          $jd = GregorianToJD( 1, 1, 1970 );
          $gregorian = JDToGregorian( $jd + intval ( $date ) - 25569 );
          $date = explode( '/', $gregorian );
          $date_str = str_pad( $date [2], 4, '0', STR_PAD_LEFT )
          ."-". str_pad( $date [0], 2, '0', STR_PAD_LEFT )
          ."-". str_pad( $date [1], 2, '0', STR_PAD_LEFT )
          . ($time ? " 00:00:00" : '');
          return $date_str;
          }
      }else{
          $date=$date>25568?$date+1:25569;
          /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
          $ofs=(70 * 365 + 17+2) * 86400;
          $date = date("Y-m-d",($date * 86400) - $ofs).($time ? " 00:00:00" : '');
      }
    return $date;
  }

<h1>本文为原创文章,转载请注明出处</h1>
<h1>觉得本文对你有帮助</h1>
关注简书mid米店,持续分享中。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容