Como obter ano, mês, dia, horas, minutos, segundos e milissegundos do momento atual em Java?

104

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.

romano
fonte

Respostas:

254

Você pode usar os getters de java.time.LocalDateTimepara 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 intpara 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

Veja também:

BalusC
fonte
Se você for usar printf, você também pode usar os formatos de Data / Horas em vez de usar a etapa intermediária, ou seja, "% 1 $ tm% 1 $ te,% 1 $ tY", c (consulte java.util. Formatador para a sintaxe completa)
M. Jessup,
1
@M. Jessup: Isso é realmente melhor. No entanto, nunca usei isso, então não pude entrar de cabeça, o acima é apenas para fins de demonstração. Independentemente disso, eu prefiro pegar SimpleDateFormatou DateTimeFormatterpara essa tarefa em particular :)
BalusC
Eu sugiro fortemente o uso de joda-time, já que sua API é muito mais agradável e compreensível em comparação com as datas e calendários mal projetados que o Java oferece diretamente.
Kaitsu
Eu prefiro este, especialmente no trabalho i18n para obter startTime ou endTime:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy
1
Grande parte da funcionalidade java.time é portada para Java 6 e 7 no projeto ThreeTen-Backport .
Basil Bourque
30

Mude para o tempo joda e você pode fazer isso em três linhas

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

Você também tem acesso direto aos campos individuais da data sem usar um calendário.

System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());

O resultado é o seguinte:

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

De acordo com http://www.joda.org/joda-time/

Joda-Time é a biblioteca de data e hora padrão de fato para Java. Do Java SE 8 em diante, os usuários são solicitados a migrar para java.time (JSR-310).

Crowne
fonte
1
Para sua informação, o projeto Joda-Time está agora em manutenção, com sua equipe assessorando a migração para as classes java.time. Joda-Time e java.time são liderados pelo mesmo homem, Stephen Colebourne.
Basil Bourque
7
    // Java 8
    System.out.println(LocalDateTime.now().getYear());       // 2015
    System.out.println(LocalDateTime.now().getMonth());      // SEPTEMBER
    System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
    System.out.println(LocalDateTime.now().getHour());       // 7
    System.out.println(LocalDateTime.now().getMinute());     // 36
    System.out.println(LocalDateTime.now().getSecond());     // 51
    System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100

    // Calendar
    System.out.println(Calendar.getInstance().get(Calendar.YEAR));         // 2015
    System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1);   // 9
    System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
    System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));  // 7
    System.out.println(Calendar.getInstance().get(Calendar.MINUTE));       // 35
    System.out.println(Calendar.getInstance().get(Calendar.SECOND));       // 32
    System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));  // 481

    // Joda Time
    System.out.println(new DateTime().getYear());           // 2015
    System.out.println(new DateTime().getMonthOfYear());    // 9
    System.out.println(new DateTime().getDayOfMonth());     // 29
    System.out.println(new DateTime().getHourOfDay());      // 7
    System.out.println(new DateTime().getMinuteOfHour());   // 19
    System.out.println(new DateTime().getSecondOfMinute()); // 16
    System.out.println(new DateTime().getMillisOfSecond()); // 174

    // Formatted
    // 2015-09-28 17:50:25.756
    System.out.println(new Timestamp(System.currentTimeMillis()));

    // 2015-09-28T17:50:25.772
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));

    // Java 8
    // 2015-09-28T17:50:25.810
    System.out.println(LocalDateTime.now());

    // joda time
    // 2015-09-28 17:50:25.839
    System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));
blueberry0xff
fonte
Essa resposta realmente aborda a questão, que perguntou sobre o acesso aos componentes de um valor de data e hora (não as strings formatadas usuais).
Basil Bourque
6

Com o Java 8 e posterior, use o pacote java.time .

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

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 um intvalor.

Ortomala Lokni
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. Use Instant, ZonedDateTimeou em OffsetDateTimevez disso.
Basil Bourque de
Você está certo. Modifiquei minha resposta para usar a ZonedDateTime.
Ortomala Lokni
3

tl; dr

ZonedDateTime.now(                    // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "America/Montreal" )   // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
)                                     // Returns a `ZonedDateTime` object.
.getMinute()                          // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.

42

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, como America/Montreal, Africa/Casablanca, ou Pacific/Auckland. Nunca utilize o 3-4 letras, como ESTou ISTcomo eles são não zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Chame qualquer um dos muitos getters para extrair pedaços da data e hora.

int    year        = zdt.getYear() ;
int    monthNumber = zdt.getMonthValue() ;
String monthName   = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ;  // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int    dayOfMonth  = zdt.getDayOfMonth() ;
String dayOfWeek   = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
int    hour        = zdt.getHour() ;  // Extract the hour from the time-of-day.
int    minute      = zdt.getMinute() ;
int    second      = zdt.getSecond() ;
int    nano        = zdt.getNano() ;

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 TimeUnitenum para essa conversão.

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

Para produzir um Stringpara combinar pedaços de texto, use DateTimeFormatterclasse. 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.

Instant instant = zdt.toInstant() ;

E volte novamente.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

Algumas outras Respostas usam a LocalDateTimeclasse. 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? Use LocalDateTimequando 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 (a ZoneId) para obter a ZonedDateTime. 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 com ZonedDateTime. O Natal em todos os lugares é representado por um LocalDateTime.


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, e SimpleDateFormat.

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?

Basil Bourque
fonte
2

Ou use java.sql.Timestamp. O calendário é meio pesado, eu não recomendo usá-lo no código de produção. Joda é melhor.

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}
pavel
fonte
Acho que você entendeu mal a pergunta e o uso do carimbo de data / hora sql. Você normalmente usaria new Date()aqui. Mas como você obteria as partes separadas dele facilmente, conforme solicitado?
BalusC de
FYI, java.sql.Timestampfoi suplantado pelo java.time.Instantcom a chegada do JDBC 4.2.
Basil Bourque de
0

em java 7 Calendar uma linha

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())
Lucke
fonte
1
As classes Calendar e SimpleDateFormat problemáticas agora estão desatualizadas, suplantadas inteiramente pelas classes java.time. Veja a Resposta de BalusC para a abordagem moderna. Grande parte da funcionalidade java.time é portada para Java 6 e 7 no projeto ThreeTen-Backport .
Basil Bourque
-2

Consulte a documentação da API para a classe java.util.Calendar e seus derivados (você pode estar especificamente interessado na classe GregorianCalendar).

M. Jessup
fonte
Para sua informação, as velhas classes problemáticas de data e hora, como java.util.Date, java.util.Calendare java.text.SimpleDateFormatagora são legadas , suplantadas pelas classes java.time construídas no Java 8 e posterior. Veja o Tutorial da Oracle .
Basil Bourque de
-2

Calendar now = new Calendar () // ou new GregorianCalendar (), ou o que você precisar

agora.MÊS agora.HORA

etc.

llappall
fonte
3
Olá, estou tendo dificuldade em entender porque você está repetindo uma resposta já dada de forma inadequada. Por favor, elabore :)
BalusC
3
MONTHe HOURsão constantes estáticas de Calendar, não propriedades de instância.
Joseph Earl