PHP 从 43556 等值中获取月份和年份
Posted
技术标签:
【中文标题】PHP 从 43556 等值中获取月份和年份【英文标题】:PHP get month and year from a value such as 43556 【发布时间】:2019-10-14 05:22:01 【问题描述】:我在数据库中有一个名为“GROWTH_SALES_MONTHSTART”的字段,其值为 43556。在 php 中获取月份和年份的正确方法是什么?
strtotime( "43556")
给出bool(false)
。
编辑: 我尝试了以下方法,但日期不正确。
$tt = date( 'M-y', 43556 ) ;
var_dump( $tt );
我应该收到的实际日期是 4 月 19 日,而我收到的是 1 月 70 日。我错过了什么吗?
我正在从 CSV 中提取值 (43556)。
【问题讨论】:
strtotime()
只接受 valid formatted string 和 43556
不是有效的格式日期时间字符串。将数字43556
转换为月份和年份时,您的期望值是多少?首先,您是如何将月份-年份转换为该数字的?
你告诉我如何在纸上做。然后也许我会告诉你如何在 PHP 中使用它。换句话说,你没有告诉我们为什么 43556 映射到 apr19。如果 IT 是 Unix 时间戳,它会在 1970 年 1 月 1 日中午左右。但情况可能并非如此......那么这些数字映射到日期的逻辑是什么?
如果 csv 是从 Excel 导出的。它可能是excels日期表示。 “无论您如何格式化单元格以显示日期或时间,Excel 始终以相同的方式在内部存储日期和时间。Excel 将日期和时间存储为表示自 1900 年 1 月 0 日以来的天数的数字,加上小数一天 24 小时的一部分: ddddd.tttttt " 然后 43556 与似乎更可能的情况相距大约 122 年。试试phpspreadsheet库,应该有一个类来处理转换。
Convert the FULL Excel date serial format to Unix timestamp的可能重复
【参考方案1】:
PHP 的内置strtotime(...)
方法需要有效的时间格式并将您的输入视为秒,关于您尝试转换为时间的值,我们可以这样说:
43556 seconds
等于725.9
小时(除以60
)
725.9
小时等于 30.2
天。
30
天等于又只有一个月。
一年的第一个月是January
。
PHP 时钟的第一年是1970
。
这就是为什么你坚持使用Jan-70
。
无论如何,如果您的时间是基于Excel
,您可以使用以下公式将Excel 日期 更改为Unix 日期,然后您可以使用“gmdate(...)
" 获取真实日期(如another answer):
$EXCEL_DATE = 43556; // Your CSV value goes here
$UNIX_DATE = ($EXCEL_DATE - 25569) * 86400;
echo gmdate("d-M-Y H:i:s", $UNIX_DATE);
输出:
01-Apr-2019 00:00:00
但是,如果您的时间不是基于Excel
,您应该:
1970
应该为零),得到$baseTime
。
最后,只需将 $baseTime
添加到您的 CSV 时间值。
例如:
$baseTime = strtotime( 'Tue Dec 15 2009' );
$tt = date( "d-m-Y H:i:s", strtotime( $baseTime + 43556 ) );
var_dump( $tt );
【讨论】:
所以总有办法 :) 你拯救了我的一天。非常感谢@Top-Master!有用!!但是请告诉我25569
是做什么的?
如果 CSV 文件保存在 MS Windows
平台上,25569
常量是基准日期,但如果 CSV 文件是从其他平台保存的,则应使用 24107
常量。 (有一个更完整的代码示例取自another answer 中的PhpExcel
用于此)。
只是好奇。有什么方法可以知道 XL 保存在哪个平台上?
Windows 的基准日期是 1900
,Mac 的基准日期是 1904
,PHPExcel
确实使用 Windows 的基准日期 默认情况下,我们可以确定它的唯一可能方法是知道有效日期应该是什么样子,例如,如果我们使用 Mac 常量,您的值将导致年份 @ 987654350@(不是2019
)。以上是关于PHP 从 43556 等值中获取月份和年份的主要内容,如果未能解决你的问题,请参考以下文章