Preciso retornar a data e hora atual no seguinte formato…
2023-02-07T15:24:51-00:00
alguém tem ideia de como fazer?
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).