我有一组格式如下的日期......
197402
192201
184707
前四位数表示年份,其余两位数表示月份。我试图以这种格式输出这些
February 1974
January 1922
July 1847
我试过把它传递给像这样的日期函数......
echo date ('F Y', 197402)
但每次都给我 1970年1月所以我认为我误解了日期功能是如何运作的,有人可以帮忙吗?
答案 0 :(得分:5)
你得到" 1970年1月"作为输出,因为你试图从 timestamp 197402
创建一个日期,这是从1970年1月1日起的秒数。如果从那里输出完整的字符串(有秒和诸如此类) ,你会看到它是一个有效的时间戳,产生一个实际的日期,但它们都在1970年1月初结束,见online demo。
这种格式,YYYYMM,对于大多数功能来说都不是一种可识别的格式。您需要将其拆分,如果您知道格式将以这种方式 - 并使用该数据。您可以使用substr()
拆分字符串,然后在date()
和mktime()
的帮助下将数字月份转换为与该月相关联的字符串(因为您只需指定年份和月)。
以下代码段
$arr = [197402, 192201, 184707];
foreach ($arr as $v) {
$year = substr($v, 0, 4);
$month = substr($v, 4, 2);
echo date("F Y", mktime(0, 0, 0, $month, 0, $year))."<br />"; // mktime() produces a valid timestamp based on just month and year
// Alternatively, drop mktime() and use strtotime() and create from a standard format,
// while specifying a date in the month (which won't matter to the output)
// echo date("F Y", strtotime("$month/01/$year"))."<br />";
}
将输出
1974年2月
1922年1月 1847年7月
或者,您可以使用DateTime类(更简单使用),并使用date_create_from_format()
foreach ($arr as $v) {
echo date_create_from_format('Yh', $v)->format('F Y')."<br />";
}
这将生成与上面相同的输出。
答案 1 :(得分:4)
我使用DateTime class,您可以从特定格式创建,然后输出到另一个。
正如下面的评论中所指出的那样,您还需要将日期设置为该月的第一天,否则如果当前日期大于给定月份的天数,您将收到不需要的结果。
echo DateTime::createFromFormat('Ymd', 19470201)->format('F Y');
答案 2 :(得分:3)
当你传递一个int到目前为止,它正在考虑它作为Unix时间戳。
要从预定义格式创建日期对象,请使用DateTime::createFromFormat
。
echo DateTime::createFromFormat('Ym',198403)->format('F Y');
结果
March 1984
答案 3 :(得分:2)
您需要为其添加一天,例如只需添加&#34; 01&#34;然后使用strtotime将其转换为unix时间戳,因为date()函数需要时间戳作为参数。
e.g。
echo date('F Y', strtotime("19220101"));
答案 4 :(得分:1)
您可以使用非标准格式表示日期。首先,您必须解析它们并将它们转换为时间戳(自1970年1月1日00:00:00 UTC以来的秒数)。 PHP函数date()
只能用于时间戳。
最佳方法(截至2017年)是将DateTime
PHP类用于日期和时间。时间处理:
foreach (array('197402', '192201', '184707') as $text) {
$date = DateTime::createFromFormat('Ym', $text);
echo($date->format('F Y')."\n");
}
方法DateTime::createFromFormat()
使用给定格式解析字符串,并在解析成功时创建新的DateTime
对象。它的OOP等价于strtotime()
但更聪明(因为它可以获得有关在输入字符串中搜索的日期组件的提示。)
方法DateTime::format()
使用提供的格式生成日期的文本表示。它的OOP等价于date()
。
建议使用OOP方法(DateTime*
classes)(并且比程序方法更好),因为它具有对时区的内置支持(程序日期时间函数缺少它)。