Seu formato,
YYYY-mm-dd'T'HH:MM:ss'Z'
não está correto. Vamos discutir tudo o que está errado com este formato. - Você usou
Y
em vez dey
: O símboloY
é usado paraWeek year
enquantoy
é usado paraYear
. Verifique Diferença entre ano-de- era e ano com base na semana? para saber mais sobre isso. - Você usou
mm
por mês: O símbolo correto para o mês éM
. - Você usou
MM
por minutos: O símbolo correto para o minuto ém
. - Você incluiu
Z
entre aspas simples: O símbolo,Z
é usado paraTime zone
enquanto'Z'
nada mais é do que um caractere literal. Provavelmente você deseja formatar o deslocamento do fuso horário de+00:00
comoZ
e para isso, você deve de fato usarX
.
Assim, o formato correto é o seguinte:
yyyy-MM-dd'T'HH:mm:ssX
Uma demonstração com o formato sugerido:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.ENGLISH);
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(sdf.format(date));
}
}
Saída:
2021-01-14T08:13:01Z
Observe que a API de data e hora de
java.util
e sua API de formatação, SimpleDateFormat
estão desatualizados e sujeitos a erros. Recomenda-se parar de usá-los completamente e mudar para o API moderna de data e hora
. - Por qualquer motivo, se você precisar manter o Java 6 ou o Java 7, poderá usar ThreeTen-Backport que suporta a maior parte do java.time funcionalidade para Java 6 e 7.
- Se você estiver trabalhando para um projeto Android e seu nível de API do Android ainda não for compatível com Java-8, verifique APIs Java 8+ disponíveis por meio da remoção de açúcar e Como usar ThreeTenABP no projeto Android .
Use
Date#toInstant
para converter um java.util.Date
objeto (o tipo legado) para java.time.Instant
(o tipo moderno). Instant
representa um ponto instantâneo na linha do tempo e deve ser suficiente para a maioria de suas operações JSON. O Instant#toString
retorna a string de data e hora com deslocamento de fuso horário UTC que é compatível com os padrões ISO-8601
. Demonstração:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
Instant instant = date.toInstant();
// Print the value of instant#toString
System.out.println(instant);
OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC);
System.out.println(odt);
// Custom format
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX", Locale.ENGLISH);
System.out.println(dtf.format(odt));
}
}
Saída:
2021-01-14T08:28:35.659Z
2021-01-14T08:28:35.659Z
2021-01-14T08:28:35Z