Como posso obter o ano, mês, dia, horas, minutos, segundos e milissegundos do momento atual em Java? Eu gostaria de tê-los como Strings
.
104
Você pode usar os getters de java.time.LocalDateTime
para isso.
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Ou, se você não estiver no Java 8 ainda, use java.util.Calendar
.
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
De qualquer forma, isso será impresso a partir de agora:
16-04-2010 15: 15: 17.816
Para converter um int
para String
, use String#valueOf()
.
Se sua intenção é, afinal, organizá-los e exibi-los em um formato de string amigável, então é melhor usar o Java8 java.time.format.DateTimeFormatter
( tutorial aqui ),
LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
ou quando você ainda não está no Java 8, use java.text.SimpleDateFormat
:
Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
De qualquer forma, isso resulta em:
16-04-2010T15: 15: 17.816 Sex, 16 de abril de 2010 15:15:17 GMT 20100416151517
SimpleDateFormat
ouDateTimeFormatter
para essa tarefa em particular :)new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Mude para o tempo joda e você pode fazer isso em três linhas
Você também tem acesso direto aos campos individuais da data sem usar um calendário.
O resultado é o seguinte:
De acordo com http://www.joda.org/joda-time/
fonte
fonte
Com o Java 8 e posterior, use o pacote java.time .
ZonedDateTime.now()
é um método estático que retorna a data e hora atual do relógio do sistema no fuso horário padrão. Todos os métodos get retornam umint
valor.fonte
LocalDateTime
é precisamente a classe errada para isso. Sem qualquer conceito de fuso horário ou compensar-de-UTC, ele não pode ser usado para rastrear um momento específico, é não um ponto na linha do tempo. UseInstant
,ZonedDateTime
ou emOffsetDateTime
vez disso.ZonedDateTime
.tl; dr
ZonedDateTime
Para capturar o momento atual conforme visto no relógio de parede usado pelas pessoas de uma determinada região (um fuso horário), use
ZonedDateTime
.Um fuso horário é crucial para determinar uma data. Para qualquer momento, a data varia ao redor do globo por zona. Por exemplo, alguns minutos depois da meia-noite em Paris, a França é um novo dia e ainda “ontem” em Montreal Québec .
Se nenhum fuso horário for especificado, a JVM aplicará implicitamente seu fuso horário padrão atual. Esse padrão pode mudar a qualquer momento durante o tempo de execução (!), Então seus resultados podem variar. Melhor especificar o fuso horário desejado / esperado explicitamente como um argumento.
Especifique um nome próprio fuso horário no formato
continent/region
, comoAmerica/Montreal
,Africa/Casablanca
, ouPacific/Auckland
. Nunca utilize o 3-4 letras, comoEST
ouIST
como eles são não zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).Chame qualquer um dos muitos getters para extrair pedaços da data e hora.
As classes java.time resolvem em nanossegundos . Sua pergunta foi feita por uma fração de segundo em milissegundos . Obviamente, você pode dividir por um milhão para truncar nanossegundos em milissegundos, ao custo de uma possível perda de dados. Ou use o
TimeUnit
enum para essa conversão.DateTimeFormatter
Para produzir um
String
para combinar pedaços de texto, useDateTimeFormatter
classe. Pesquise Stack Overflow para mais informações sobre isso.Instant
Geralmente é melhor monitorar momentos em UTC. Para ajustar de uma data e hora zoneada para UTC, extraia a
Instant
.E volte novamente.
LocalDateTime
Algumas outras Respostas usam a
LocalDateTime
classe. Essa classe não é apropriada para o propósito de rastrear momentos reais, momentos específicos na linha do tempo, pois intencionalmente não tem nenhum conceito de fuso horário ou deslocamento do UTC.Então, para que serve
LocalDateTime
? UseLocalDateTime
quando você pretende aplicar uma data e hora a qualquer localidade ou todas as localidades , ao invés de uma localidade específica.Por exemplo, o Natal deste ano começa no dia
LocalDateTime.parse( "2018-12-25T00:00:00" )
. Esse valor não tem significado até que você aplique um fuso horário (aZoneId
) para obter aZonedDateTime
. O Natal acontece primeiro em Kiribati , depois na Nova Zelândia e no Extremo Oriente da Ásia. Horas depois, o Natal começa na Índia. Mais uma hora depois na África e na Europa. E ainda não é Natal nas Américas até várias horas depois. Natal a partir de qualquer um lugar deve ser representado comZonedDateTime
. O Natal em todos os lugares é representado por umLocalDateTime
.Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
fonte
Ou use java.sql.Timestamp. O calendário é meio pesado, eu não recomendo usá-lo no código de produção. Joda é melhor.
fonte
new Date()
aqui. Mas como você obteria as partes separadas dele facilmente, conforme solicitado?java.sql.Timestamp
foi suplantado pelojava.time.Instant
com a chegada do JDBC 4.2.em java 7 Calendar uma linha
fonte
Consulte a documentação da API para a classe java.util.Calendar e seus derivados (você pode estar especificamente interessado na classe GregorianCalendar).
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
agora são legadas , suplantadas pelas classes java.time construídas no Java 8 e posterior. Veja o Tutorial da Oracle .Calendar now = new Calendar () // ou new GregorianCalendar (), ou o que você precisar
agora.MÊS agora.HORA
etc.
fonte
MONTH
eHOUR
são constantes estáticas deCalendar
, não propriedades de instância.