PHP,日期被1天抵消。从DOY(Y-z)格式到string/unix

PHP,日期被1天抵消。从DOY(Y-z)格式到string/unix,php,datetime,date-format,Php,Datetime,Date Format,我需要以“Y-z”格式获取一个日期,即年份doy(例如,2013-146),并将其转换为unix时间戳以存储到数据库中 我遇到的问题是,我输入2013-146并将其转换为DateTime对象。然后,当我以unix或“Y-m-d”格式输出此日期时,我得到的是2013-5-27,而不是2013-5-26,这是正确的日期 您可以在这个和这个上验证DOY 总结: --我有日期:“2013-146” --使用DateTime::createFromFormat并使用“Y-m-d”和“Y-z”进行回音,我分

我需要以“Y-z”格式获取一个日期,即年份doy(例如,2013-146),并将其转换为unix时间戳以存储到数据库中

我遇到的问题是,我输入2013-146并将其转换为DateTime对象。然后,当我以unix或“Y-m-d”格式输出此日期时,我得到的是2013-5-27,而不是2013-5-26,这是正确的日期

您可以在这个和这个上验证DOY

总结: --我有日期:“2013-146” --使用DateTime::createFromFormat并使用“Y-m-d”和“Y-z”进行回音,我分别得到:2013-5-27和2013-146。 --这与我列出的美国宇航局网站不符,被抵消了一天。有人能证实我没有失去理智吗

以下是您可以测试的代码:

<?php
date_default_timezone_set('America/Chicago');
$year = 2013;  //where this outputs a simple year 'CCYY'
$day = 146;        //where this provides the day of year

$format = 'Y-z';    //specifying what format i'm creating the datetime with
$date = $year.'-'.$day;         //formatting the strings to the above $format
$timezone = new DateTimeZone('America/Chicago');     //specify the timezone
$fileDateStore = DateTime::createFromFormat($format, $date, $timezone);//, $timezone);  //create the DateTime object
$fileDateString = date_format($fileDateStore,"Y-m-d");  //format it so strtotime() can read it
$fileDate = strtotime($fileDateString);  //finally create the Unix Timestamp for the date.
$newfileDOY = date_format($fileDateStore,"Y-z");
echo 'newfileDOY = '.$newfileDOY.', ';
echo 'date = '.$date.', ';
echo 'fileDateString = '.$fileDateString.', ';
echo 'fileDate = '.$fileDate.PHP_EOL;
?>

问题在于PHP中的
z
格式以0开头,而不是以1开头

看看:

z:一年中的某一天(从0开始)


问题是PHP中的than
z
格式以0开头,而不是以1开头

看看:

z:一年中的某一天(从0开始)


这可能是一个时区问题
2013-146凌晨3点
芝加哥是
2013-145晚上9点
或者UTC的任何地方。我也这么想,但我没有存储时间。此外,我还小心地将默认时区强制为Chicago,以便在
date\u format()
strotime()
中使用。我也在创建时区时将其放入
DateTimeZone('America/Chicago')
中,因此我两次将时区强制为'America/Chicago'是的,但在内部,每个php时间戳/datetimeobject都有一个隐式时间。如果您不指定一个,它将是
00:00:00
,如果您在时区之间移动(即使它完全在PHP中),这些“午夜”时间也将调整为本地/utc时间。这可能是一个时区问题
2013-146凌晨3点
芝加哥是
2013-145晚上9点
或者UTC的任何地方。我也这么想,但我没有存储时间。此外,我还小心地将默认时区强制为Chicago,以便在
date\u format()
strotime()
中使用。我也在创建时区时将其放入
DateTimeZone('America/Chicago')
中,因此我两次将时区强制为'America/Chicago'是的,但在内部,每个php时间戳/datetimeobject都有一个隐式时间。如果您不指定一个,它将是
00:00:00
,并且如果您在时区之间移动(即使它完全在PHP中),这些“午夜”时间也将调整为/从本地/utc时间。此外(支持)此答案,请参阅手册:
z:一年中的某一天(从0开始)
@AbraCadaver如果您正在用php构建日期字符串,请添加1以在其他地方使用。如果您从其他地方获取日期字符串,那么您将在php中使用-1天。。。s、 m.h.,脸,手掌,不管怎样。非常感谢您进行簿记。除此之外(支持),请参阅手册:
z:day of the year(从0开始)
@AbraCadaver如果您正在用php构建日期字符串,请添加1以在其他地方使用。如果您从其他地方获取日期字符串,那么您将在php中使用-1天。。。s、 m.h.,脸,手掌,不管怎样。非常感谢你记账。