Форматирование даты с неопределенными данными

Быстрый поиск не дал результатов, которые, казалось бы, соответствовали тому, что я искал, поэтому я прихожу сюда с просьбой о помощи.

Я работаю над форматированием дня рождения. Проблема в том, что использование имеет возможность вводить только некоторые (или никакие) данные. Он хранится отдельно как день, месяц и год.

По сути, на основе имеющихся данных будет определено, как дата будет отформатирована и отображена обратно пользователю.

Мой подход:

#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');
}

Мне было интересно, есть ли лучший способ выполнить эту задачу. Я думаю, я думаю, что должен быть лучший способ. Заранее спасибо. Если мне нужно что-то уточнить, пожалуйста, просто спросите!

редактировать: удален ненужный код

1

Решение

Ваш код может выводить недопустимую дату, так как вы не фильтруете ввод при настройке 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"));
}
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]