Java - Como faço pra data e hora retornar no seguinte formato?

Preciso retornar a data e hora atual no seguinte formato…
2023-02-07T15:24:51-00:00

alguém tem ideia de como fazer?

Em princípio é só usar o seguinte DateFormat:

"yyyy-MM-dd'T'HH:mm:ss-XXX"

Não será antes “yyyy-MM-dd’T’HH:mm:ssXXX”, sem o - antes do XXX? O - já deverá fazer parte da timezone…

Não sei dizer, acredito que quando o Timezone for zero, não acrescente o “-” nem o “+”.

Depende, se está usando Java >= 8, basta usar um java.time.OffsetDateTime, juntamente com um java.time.ZoneOffset para que esteja em UTC (pois o 00:00 indica isso, que está em UTC).

Por fim, crie um java.time.format.DateTimeFormatter para colocar no formato desejado:

OffsetDateTime dataHoraAtual = OffsetDateTime.now(ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssxxx");
System.out.println(formatter.format(dataHoraAtual)); // 2023-02-08T10:42:36+00:00

Lembrando que será mostrado como +00:00, e não -00:00 como você quer (o hífen é usado somente para offsets negativos, o zero por padrão é mostrado com o + na frente). Isso é definido pela norma ISO 8601 (a mesma que definiu este formato YYYY-MM-DDTHH:MM:SS).

Mas se quiser muito mostrar -00:00, pode usar um java.time.format.DateTimeFormatterBuilder:

OffsetDateTime dataHoraAtual = OffsetDateTime.now(ZoneOffset.UTC);
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("uuuu-MM-dd'T'HH:mm:ss")
        .appendOffset("+HH:MM", "-00:00")
        .toFormatter();
System.out.println(formatter.format(dataHoraAtual)); // 2023-02-08T10:42:36-00:00

Ou seja, no método appendOffset eu informo o formato que quero (“HH:MM”), e também o formato específico para quando for zero.


Para Java < 8, SimpleDateFormat não faz o esperado. Se usar o formato sugerido acima, vai sempre mostrar Z em vez de 00:00, mesmo se você forçar o offset:

Date dataHoraAtual = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); // forçando UTC
System.out.println(sdf.format(dataHoraAtual)); // 2023-02-08T10:52:37Z

E aí pode usar gambiarras do tipo “replace do Z para 00:00”, etc. Infelizmente, com SimpleDateFormat, não há muito mais o que fazer…

Outra opção é usar o ThreeTen Backport, um excelente backport do java.time. As classes são basicamente as mesmas do Java 8, a diferença é que estão no pacote org.threeten.bp em vez de java.time (ou seja, o código é igual ao de cima, só muda os import’s).

1 curtida