Быстрый поиск не дал результатов, которые, казалось бы, соответствовали тому, что я искал, поэтому я прихожу сюда с просьбой о помощи.
Я работаю над форматированием дня рождения. Проблема в том, что использование имеет возможность вводить только некоторые (или никакие) данные. Он хранится отдельно как день, месяц и год.
По сути, на основе имеющихся данных будет определено, как дата будет отформатирована и отображена обратно пользователю.
Мой подход:
#prepare birthday
$bday = new DateTime();
$bday->setTimezone(new DateTimeZone('America/New_York'));
$bday->setDate($row->birth_year,$row->birth_month,$row->birth_day);
if($row->birth_month && $row->birth_year && $row->birth_day){
//Full birthday entered
$display_bday = $bday->format('F j, Y');
} elseif($row->birth_month && !$row->birth_year && !$row->birth_day){
//Only a month
$display_bday = $bday->format('F');
} elseif($row->birth_month && $row->birth_year && !$row->birth_day){
//Only Month and year
$display_bday = $bday->format('F, Y');
}
Мне было интересно, есть ли лучший способ выполнить эту задачу. Я думаю, я думаю, что должен быть лучший способ. Заранее спасибо. Если мне нужно что-то уточнить, пожалуйста, просто спросите!
редактировать: удален ненужный код
Ваш код может выводить недопустимую дату, так как вы не фильтруете ввод при настройке DateTime
объект. Когда $row->birth_day
равняется 0
, DateTime
Объект вернется в предыдущий месяц (последняя дата).
Итак, предлагаю учесть, что:
$display_bday = null;
if ($row->birth_month) {
if ($row->birth_year) {
if ($row->birth_day) {
// day, month, and year
$display_bday = date('F j, Y', strtotime("$row->birth_year-$row->birth_month-$row->birth_day"));
} else {
// month and year
$display_bday = date('F, Y', strtotime("$row->birth_year-$row->birth_month-01"));
}
} else {
if ($row->birth_day) {
// day and month
$display_bday = date('F j', strtotime("2016-$row->birth_month-$row->birth_day"));
} else {
// month only
$display_bday = date('F', strtotime("2016-$row->birth_month-01"));
}
}
}
Других решений пока нет …