# Como corrigir o Date Picker que não formata a data no ACF PRO

O ACF Date Picker formato sai errado quando o template usa o valor cru salvo no banco, que o ACF PRO sempre grava como Ymd (AAAAMMDD), em vez de aplicar o Return Format ou converter a string com DateTime antes de exibir.

## O que é Date Picker que não formata a data no ACF PRO?

O ACF Date Picker formato de data envolve três configurações distintas do campo Date Picker no ACF PRO: o Display Format, que controla como a data aparece no calendário ao selecionar, o Return Format, que define o formato da string devolvida ao carregar o valor com get_field, e o valor real gravado no banco. Segundo a documentação oficial do ACF, o valor e sempre salvo como Ymd (AAAAMMDD) no banco, independente do que o usuário ve no painel.

O problema de formatacao aparece quando o template ignora essa separacao. Se o código le o valor cru ou usa um Return Format diferente do esperado, a data sai como 20260617 em vez de 17/06/2026, ou simplesmente não bate com o formato configurado. A solução passa por alinhar o Return Format do campo e, quando precisa de um formato dinâmico no template, converter a string Ymd para um objeto DateTime antes de exibir.

## Como identificar

- A data aparece no template como um número cru no formato 20260617 em vez de uma data legivel como 17/06/2026.
- O valor exibido não corresponde ao Display Format escolhido no campo, mostrando outro formato ao renderizar no frontend.
- Ao alterar o Return Format no painel do ACF, as datas já salvas continuam saindo no formato antigo no template.
- A função date() ou DateTime gera o aviso 'Failed to parse time string' porque recebe a string Ymd em vez de um timestamp valido.
- No JavaScript do calendário a data selecionada não respeita o formato configurado quando o Display Format usa caracteres especiais como o @ do PHP.

**Antes de começar:** Antes de alterar o Return Format de campos já em uso ou editar o functions.php em producao, faça um backup do site (arquivos e banco de dados) ou teste primeiro em um ambiente de staging. Mudar o Return Format afeta como o valor e lido em todos os templates que usam o campo.

## Como prevenir

- Defina o Return Format do Date Picker no momento de criar o campo, já alinhado ao formato que o template vai exibir, para não depender de conversao no código.
- Lembre que o ACF sempre grava o valor como Ymd no banco: ao atualizar uma data via update_field, passe sempre a string no formato Ymd.
- Padronize a conversao de datas do ACF com DateTime::createFromFormat usando Ymd como mascara, evitando passar a string crua para date() que espera timestamp.
- Documente nos campos Date Picker quais usam Display Format com caracteres especiais e mantenha o filtro php_to_js_date_formats versionado no tema ou plugin.

Erros relacionados

- [Como corrigir o Image Field no ACF PRO](https://full.services/wp-fixer/corrigir-image-field-acf-pro/)
- [Como corrigir o Select Field no ACF PRO](https://full.services/wp-fixer/corrigir-select-field-acf-pro/)
- [Como corrigir o WYSIWYG Editor que não carrega no ACF PRO](https://full.services/wp-fixer/corrigir-wysiwyg-editor-acf-pro/)

## Causa

- O template le o valor cru do Date Picker, que o ACF PRO sempre grava como Ymd (AAAAMMDD) no banco segundo a doc oficial, sem aplicar o Return Format nem converter a string antes de exibir.
- O Return Format do campo esta configurado com um formato diferente do que o template espera (por exemplo Ymd no campo e d/m/Y no código), entao get_field devolve a string num formato e o template assume outro.
- O código passa a string Ymd direto para a função date() do PHP, que espera um timestamp Unix e não uma data formatada, retornando uma data invalida ou aviso de parse.
- O Display Format e o Return Format foram trocados de lugar: o Display Format so afeta o calendário no painel e não muda o valor devolvido por get_field, que segue o Return Format.
- O Display Format usa o caractere especial @ do PHP sem o filtro acf/settings/php_to_js_date_formats, fazendo o calendário JavaScript interpretar o formato de modo diferente do PHP.

## Como resolver

1. Ajuste o Return Format do campo Date Picker: Em ACF -> Grupos de Campos, abra o campo Date Picker e defina o Return Format no formato que o template vai exibir, como d/m/Y. O Return Format e o que controla a string devolvida por get_field, e não o Display Format, que so afeta o calendário no painel.

```
Painel WP -> ACF -> Grupos de Campos -> abra o grupo e edite o campo Date Picker
Defina Return Format como d/m/Y (ou o formato desejado)
Salve o grupo de campos
```

2. Use get_field e confie no Return Format no template: No template, recupere o valor com get_field. A string já vem no Return Format configurado no passo anterior, entao basta exibi-la. Não leia o valor cru do banco nem reformate sem necessidade.

```
Recupere o valor: $data = get_field( 'data_evento' )
Exiba direto: echo esc_html( $data )
```

3. Converta a string Ymd com DateTime para formato dinâmico: Quando você precisa de um formato diferente no template sem mexer no campo, ou definiu o Return Format como Ymd, converta a string para um objeto DateTime com createFromFormat usando Ymd como mascara de entrada e depois aplique o formato de saida desejado.

```
$valor = get_field( 'data_evento' )
$date = DateTime::createFromFormat( 'Ymd', $valor )
echo $date->format( 'j M Y' )
```

4. Exiba a data localizada em portugues com date_i18n: Para mostrar o mes em portugues, gere o timestamp a partir do objeto DateTime e passe para date_i18n, que aplica a tradução do WordPress. Assim a data sai como 17 de junho de 2026 em vez do mes em ingles.

```
$date = DateTime::createFromFormat( 'Ymd', get_field( 'data_evento' ) )
echo date_i18n( 'j de F de Y', $date->getTimestamp() )
```

5. Trate caracteres especiais do formato com o filtro do ACF: Se o Display Format usa um caractere especial do PHP como o @ e o calendário JavaScript exibe diferente, registre o filtro acf/settings/php_to_js_date_formats para mapear o caractere PHP para o equivalente do datepicker jQuery UI, conforme a doc oficial do ACF.

```
Edite o functions.php do tema ou um plugin próprio
Adicione o filtro acf/settings/php_to_js_date_formats (ver bloco de código abaixo)
Salve e recarregue a tela de edição do campo
```


## Código

```php
<?php
// 1) Exibir a data do ACF Date Picker no template, convertendo o Ymd salvo.
$valor = get_field( 'data_evento' );
if ( $valor ) {
    // O ACF grava sempre como Ymd (AAAAMMDD); cria o objeto a partir disso.
    $date = DateTime::createFromFormat( 'Ymd', $valor );
    if ( $date ) {
        // Data localizada em portugues via date_i18n (ex.: 17 de junho de 2026).
        echo esc_html( date_i18n( 'j de F de Y', $date->getTimestamp() ) );
    }
}

// 2) Caractere especial @ no Display Format: mapeia o formato PHP para o jQuery UI.
add_filter( 'acf/settings/php_to_js_date_formats', function ( $formats ) {
    $formats['@'] = '@'; // mantem o caractere intacto no datepicker
    return $formats;
} );
```

## Perguntas frequentes

### Por que o ACF Date Picker retorna a data como 20260617

Porque o ACF PRO sempre grava o valor no banco como Ymd (AAAAMMDD), segundo a documentação oficial. Se o template le o valor cru ou o Return Format esta como Ymd, a data sai nesse formato. Ajuste o Return Format ou converta a string com DateTime antes de exibir.

### Qual a diferenca entre Display Format e Return Format no Date Picker

O Display Format controla apenas como a data aparece no calendário ao selecionar no painel. O Return Format define o formato da string devolvida por get_field ao carregar o valor. Para o template, o que importa e o Return Format.

### Como exibir a data do ACF Date Picker no formato dia mes ano

Defina o Return Format do campo como d/m/Y, ou converta a string Ymd no template com DateTime::createFromFormat e depois aplique o format desejado, como j M Y. Assim você controla o formato de saida sem mexer no valor salvo.

### Por que a função date() gera erro com a data do ACF

A função date() do PHP espera um timestamp Unix, mas o ACF devolve uma string formatada. Passe a string para DateTime::createFromFormat com a mascara Ymd e use o getTimestamp do objeto antes de qualquer função que precise de timestamp.

### Como mostrar o mes em portugues na data do ACF

Converta a string Ymd para um objeto DateTime, pegue o timestamp com getTimestamp e passe para date_i18n, que aplica a tradução do WordPress conforme o idioma do site. O nome do mes sai em portugues automaticamente.

### Em que formato devo salvar a data ao usar update_field no Date Picker

Sempre no formato Ymd (AAAAMMDD). A documentação do ACF afirma que ao atualizar o valor manualmente você deve usar o formato Ymd, que e como o campo armazena a data no banco, independente do Display ou Return Format.

### Por que o calendário mostra a data diferente do formato PHP configurado

Quando o Display Format usa caracteres especiais do PHP como o @, o datepicker jQuery UI pode interpretar de modo diferente. Use o filtro acf/settings/php_to_js_date_formats para mapear o caractere PHP para o equivalente do JavaScript, como indica a doc do ACF.

### Mudar o Return Format afeta as datas já salvas no banco

Não muda o valor no banco, que continua em Ymd. O Return Format so altera como get_field devolve a string daqui pra frente. As datas existentes voltam a sair no novo formato assim que você salva a configuração e recarrega o template.

**Fonte:** [Advanced Custom Fields — Date Picker Field](https://www.advancedcustomfields.com/resources/date-picker/)
