Я пытаюсь сохранить диапазон дат, который будет заполнен пользователем, с помощью 2 сборщиков дат, которые были ранее переведены на испанский язык.
Проблема в том, что когда я использую strtotime()
в даты он принимает день за день и наоборот.
Пример:
Я выбираю день 27 месяца 05 и год 2017, но возвращаемое значение является неправильным форматом даты, поскольку месяц равен 27. Если я выберу день 01 месяц 05 года 2017, он будет отображаться в массиве как день 05 месяц 01 и год 2017.
Вот функции, которые я использую, чтобы взять даты из входных текстов и сгенерировать диапазон между датами
function takedates() {
if(isset($_POST['repS'])){
$dateStart = $_POST['txtdesde'];
$dateEnd = $_POST['txthasta'];
$fechaArray = generafechas($dateStart,$dateEnd);
}
function generafechas($date1,$date2){
$fecharray = array();
if (is_string($date1) === true){
$deit1 = strftime("%d-%m-%Y",strtotime($date1));
}
if (is_string($date2) === true){
$date2 = strftime("%d-%m-%Y",strtotime($date2));
}
do {
$fecharray[] = date("m-d-Y", $date1);
$date1 = strtotime("+1 day", $date1);
} while($date1 <= $date2);
return $fecharray;
}
?>
Мой вопрос: как мне заполнить массив датами в испанском формате даты?
PS: я уже использовал setLocale(LC_TIME,'es_ES')
в файле, где я использую эти функции, а на входе отображаются такие даты, как «дд / мм / гггг»
strtotime
не учитывает ваш языковой стандарт при разборе строки datetime. Если вы используете дату, разделенную косой чертой, она считается в американском стиле m/d/y
, Если вы используете дату, разделенную точками (или тире, если год состоит из четырех цифр), предполагается, что это стиль в остальном мире (d.m.y
или же d-m-Y
). (Обратите внимание, что если вы используете только двузначный год и используете тире, PHP попытается проанализировать его как y-m-d
.)
Вместо strtotime
, вы должны использовать date-create-from-format
/ DateTime::createFromFormat
чтобы получить DateTime
объект, а затем построить вашу строку даты из этого.
ОБНОВЛЕНИЕ НА ОСНОВЕ КОММЕНТАРИЙ: Чтобы получить желаемый результат, вы должны использовать intl
обслуживания внутреннего IntlDateFormatter
учебный класс сделать вывод.
Чтобы изменить код выше (не проверено):
function generafechas($date1,$date2){
$fecharray = array();
if (is_string($date1) && is_string($date2)){
// These lines assume the input is formatted `day-month-year`,
// with 2-digit day and month, and 4-digit year.
$date1 = DateTime::createFromFormat('d-m-Y', $date1)
$date2 = DateTime::createFromFormat('d-m-Y', $date2)
} else {
throw new InvalidArgumentException('Must provide two date strings');
}
// Create the formatter
$formatter = IntlDateFormatter::create('es_ES', null, null, null, null, "d 'de' MMMM 'del' yyyy");
do {
// This line prints the first date in the format you chose above
$fecharray[] = $formatter->format($date1);
$date1->add(new DateInterval("P1D")); // `P1D` means "Duration of 1 Day" in the ISO 8601 standard
} while($date1 <= $date2);
return $fecharray;
}
Если вы предоставляете Locale вместе с данными, вы можете изменить формат строки, которая используется в createFromFormat
по мере необходимости.
Других решений пока нет …