根据未来日期自动生成年份
Auto generate year based on future date
我有一个格式为 March 8 - 10
的日期字符串,其中没有提供年份,但根据日历年的当前日期,这将是下一年三月的日期。
当与上述类似的日期超过 12 月 31 日时,提供准确年份的最佳方法是什么?
使用 $sdate > $now
进行如下思考,但是这会将比现在大的任何日期增加 +1 年,并且不会将 12 月 31 日视为当年的结束。
$dates = trim('March 8 - 10');
$now = date("Y-m-d",strtotime("now"));
if (strpos($dates,'-') !== false) {
$sdate = trim(substr($dates, 0, strpos($dates, '-')));
if ($sdate > $now) {
$sdate = strtotime("+1 year", strtotime($sdate));
$sdate = date("Y-m-d", $sdate);
}
$month = substr($sdate, 0, strpos($sdate, ' '));
$edate = $month.substr($dates, -2, strpos($dates, '-'));
$edate = date("Y-m-d",strtotime($edate));
}
我想你正在寻找这样的东西:
示例:
$in = trim('March 8 - 10');
$now = new DateTimeImmutable(); // Defaults to now
$start = DateTimeImmutable::createFromFormat('F j+', $in); // Parse month and day, ignore the rest
if ($now > $start) {
$start = $start->modify("next year");
}
$end = $start->setDate(
$start->format('Y'), // $start year
$start->format('n'), // $start month
substr($in, strrpos($in, ' ') + 1) // trailing bit of $in for day
);
echo $start->format("Y-m-d"), "\n";
echo $end->format("Y-m-d");
输出
2016-03-08
2016-03-10
给定一个像 'November 8 - 10'
这样的字符串,它会输出:
2015-11-08
2015-11-10
也许是一个天真的解决方案
$reference = time ();
$ts = strtotime ('03-08');
if ($ts < $reference)
$ts += strtotime ('+1 year') - $reference;
$result = date ('Y-m-d', $ts);
<?php
$input = 'December 8 - 10';
//$input = 'August 8 - 10'; //un-comment to test past date (next year)
$inputFormated = DateTime::createFromFormat( 'F j+', $input.date("Y") );
$now = new DateTime( 'NOW' );
if( $now > $inputFormated ){
$inputFormated->modify( '+1 Year' );
echo $inputFormated->format( 'Y-m-d' );
}else{
echo $inputFormated->format( 'Y-m-d' );
}
December 8 - 10
-> 2015-12-08
August 8 - 10
-> 2016-08-08
演示:
我有一个格式为 March 8 - 10
的日期字符串,其中没有提供年份,但根据日历年的当前日期,这将是下一年三月的日期。
当与上述类似的日期超过 12 月 31 日时,提供准确年份的最佳方法是什么?
使用 $sdate > $now
进行如下思考,但是这会将比现在大的任何日期增加 +1 年,并且不会将 12 月 31 日视为当年的结束。
$dates = trim('March 8 - 10');
$now = date("Y-m-d",strtotime("now"));
if (strpos($dates,'-') !== false) {
$sdate = trim(substr($dates, 0, strpos($dates, '-')));
if ($sdate > $now) {
$sdate = strtotime("+1 year", strtotime($sdate));
$sdate = date("Y-m-d", $sdate);
}
$month = substr($sdate, 0, strpos($sdate, ' '));
$edate = $month.substr($dates, -2, strpos($dates, '-'));
$edate = date("Y-m-d",strtotime($edate));
}
我想你正在寻找这样的东西:
示例:
$in = trim('March 8 - 10');
$now = new DateTimeImmutable(); // Defaults to now
$start = DateTimeImmutable::createFromFormat('F j+', $in); // Parse month and day, ignore the rest
if ($now > $start) {
$start = $start->modify("next year");
}
$end = $start->setDate(
$start->format('Y'), // $start year
$start->format('n'), // $start month
substr($in, strrpos($in, ' ') + 1) // trailing bit of $in for day
);
echo $start->format("Y-m-d"), "\n";
echo $end->format("Y-m-d");
输出
2016-03-08
2016-03-10
给定一个像 'November 8 - 10'
这样的字符串,它会输出:
2015-11-08
2015-11-10
也许是一个天真的解决方案
$reference = time ();
$ts = strtotime ('03-08');
if ($ts < $reference)
$ts += strtotime ('+1 year') - $reference;
$result = date ('Y-m-d', $ts);
<?php
$input = 'December 8 - 10';
//$input = 'August 8 - 10'; //un-comment to test past date (next year)
$inputFormated = DateTime::createFromFormat( 'F j+', $input.date("Y") );
$now = new DateTime( 'NOW' );
if( $now > $inputFormated ){
$inputFormated->modify( '+1 Year' );
echo $inputFormated->format( 'Y-m-d' );
}else{
echo $inputFormated->format( 'Y-m-d' );
}
December 8 - 10
-> 2015-12-08
August 8 - 10
-> 2016-08-08
演示: