Android Obter carimbo de data / hora atual?

247

Quero obter o timestamp atual assim: 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();
Rjaibi Mejdi
fonte
2
FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare Timestampestão agora legado, suplantado pelos java.time classes. A maior parte da funcionalidade java.time é portada para Java 6 e Java 7 no projeto ThreeTen-Backport . Mais adaptado para Android anterior no projeto ThreeTenABP . Consulte Como usar o ThreeTenABP… .
Basil Bourque

Respostas:

298

A solução é :

Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();
Rjaibi Mejdi
fonte
Isso não leva em consideração o deslocamento do fuso horário do dispositivo.
kjdion84
1
@ kjdion84 com licença, mas por que você acha que seria importante? Apenas com base na pergunta.
21819 C # ԃ at
82

Do blog de desenvolvedores:

System.currentTimeMillis()é o relógio "de parede" padrão (hora e data) que expressa milissegundos desde a época. O relógio de parede pode ser definido pelo usuário ou pela rede telefônica (consulte setCurrentTimeMillis (long) ), para que o tempo possa retroceder ou avançar imprevisivelmente. Este relógio deve ser usado apenas quando a correspondência com datas e horários do mundo real for importante, como em um aplicativo de calendário ou despertador. As medições de intervalo ou tempo decorrido devem usar um relógio diferente. Se você estiver usando System.currentTimeMillis(), considere ouvindo o ACTION_TIME_TICK, ACTION_TIME_CHANGEDe ACTION_TIMEZONE_CHANGEDIntenção transmissões para saber quando muda o tempo todo.

drooooooid
fonte
11
Em developer.android.com/reference/java/lang/… , descobri que System.nanoTime()é uma alternativa System.currentTimeMillis()e não possui flutuações imprevisíveis, e foi desenvolvido para medir diferenças de duração.
Bianca Daniciuc 13/09/2013
2
@ ana01 "normalmente o valor zero é sempre que o dispositivo foi inicializado pela última vez" - portanto, ele pode ser usado apenas quando você comparar diferenças de duração no mesmo dispositivo. Não é útil para armazenamento de banco de dados, por exemplo.
Michał K
1
Apenas uma observação no comentário de @ ana01 que System.nanoTime()não é adequada para exibir a hora do relógio de parede. Para esse fim, use em seu System.currentTimeMillis()lugar.
Akash Agarwal
33

1320917972 é o registro de data e hora do Unix, usando o número de segundos desde 00:00:00 UTC em 1 de janeiro de 1970. Você pode usar a TimeUnitclasse para conversão de unidades - de System.currentTimeMillis()para segundos.

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
sealskej
fonte
29

Você pode usar a classe SimpleDateFormat :

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());
Pratik Butani
fonte
22
Este não é um timestamp (tempo desde época)
Michał K
1
Não é um carimbo de data e hora e, além disso, não é eficaz (criação de SimpleDateFormat, criação de data, conversão). Evite isso.
Seynorth 30/07/14
Você está respondendo sth else, mas também é válido.
Ersks 17/07
24

Use o método abaixo para obter o carimbo de data / hora atual. Isso funciona bem para mim.

/**
 * 
 * @return yyyy-MM-dd HH:mm:ss formate date as string
 */
public static String getCurrentTimeStamp(){
    try {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentDateTime = dateFormat.format(new Date()); // Find todays date

        return currentDateTime;
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
}
Exitos
fonte
37
Esse não é um carimbo de data / hora.
1
@Hits, é formato simples de data, não um carimbo de data e hora. Você está apenas usando o nome da variável como currentTimeStap.
Ersks 17/07
12

É de uso simples:

long millis = new Date().getTime();

Se você quiser em um formato específico, precisará do Formatador como abaixo

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String millisInString  = dateFormat.format(new Date());
Pranav
fonte
8

Aqui está um registro de data e hora legível por humanos que pode ser usado em um nome de arquivo, caso alguém precise da mesma coisa que eu precisava:

package com.example.xyz;

import android.text.format.Time;

/**
 * Clock utility.
 */
public class Clock {

    /**
     * Get current time in human-readable form.
     * @return current time as a string.
     */
    public static String getNow() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d %T");
        return sTime;
    }
    /**
     * Get current time in human-readable form without spaces and special characters.
     * The returned value may be used to compose a file name.
     * @return current time as a string.
     */
    public static String getTimeStamp() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d_%H_%M_%S");
        return sTime;
    }

}
18446744073709551615
fonte
1
Ei, você também poderia dizer a melhor maneira de classificar uma lista de carimbos de data e hora? Eu estava pensando em classificá-los eu mesmo, mas pensei que poderia haver uma maneira melhor.
Abbas
Para referência futura para qualquer um lendo este estar ciente de que "android.text.format.Time" está agora obsoleta
jason.kaisersmith
5

Tente esse

time.setText(String.valueOf(System.currentTimeMillis()));

e timeStamp para formato de hora

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateString = formatter.format(new Date(Long.parseLong(time.getText().toString())));
time.setText(dateString);
Mujahid Khan
fonte
4

java.time

Eu gostaria de contribuir com a resposta moderna.

    String ts = String.valueOf(Instant.now().getEpochSecond());
    System.out.println(ts);

Saída ao executar agora:

1543320466

Embora a divisão por 1000 não seja uma surpresa para muitos, é difícil ler muito rapidamente as conversões de tempo, por isso é um mau hábito entrar quando você pode evitá-lo.

A Instantclasse que estou usando faz parte do java.time, a moderna API de data e hora do Java. Está integrado em novas versões do Android, API nível 26 e superior. Se você estiver programando para Android mais antigo, poderá obter o backport, veja abaixo. Se você não quiser fazer isso, compreensivelmente, ainda usaria uma conversão interna:

    String ts = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
    System.out.println(ts);

É o mesmo que a resposta de sealskej. A saída é a mesma de antes.

Pergunta: Posso usar o java.time no Android?

Sim, o java.time funciona bem em dispositivos Android mais antigos e mais recentes. Requer apenas pelo menos Java 6 .

  • No Java 8 e posterior e em dispositivos Android mais recentes (do nível 26 da API), a API moderna é integrada.
  • Nos Java 6 e 7 não Android, obtenha o ThreeTen Backport, o backport das novas classes (ThreeTen para JSR 310; veja os links na parte inferior).
  • No Android (mais antigo), use a edição Android do ThreeTen Backport. Chama-se ThreeTenABP. E certifique-se de importar as classes de data e hora org.threeten.bpcom subpacotes.

Ligações

Ole VV
fonte
Resposta quase perfeita (eu votei), mas, pelo menos na minha opinião sincera, você deve remover a referência do ThreeTen Backport, pois esta é uma pergunta sobre o Android e não o Java em geral. E pode ser confuso para iniciantes no Android.
Slobodan Antonijević
1
@ SlobodanAntonijević É importante que os programadores do Android entendam que (a) se eles suportam o Android 26 e posterior, eles têm uma implementação do java.time embutido, (b) se suportam o Android anterior antes dos 26, eles devem adicionar uma biblioteca , a biblioteca ThreeTenABP e (c) se estiver usando o ThreeTenABP , saiba que essa biblioteca é realmente uma adaptação do ThreeTen-Backport adaptada de Java para Android. A biblioteca ThreeTenABP é apenas um invólucro específico do Android em torno da biblioteca ThreeTen-Backport . Veja este gráfico da tabela comparando as 3 bibliotecas.
Basil Bourque
@BasilBourque você está completamente correto. Mas você pode realmente importar o ThreeTen-Backport e usá-lo em um aplicativo Android, mas com um impacto extremamente grande na causa do desempenho de sua dependência do JAR. É por isso que eu disse que a postagem deve ser mais específica, pois os desenvolvedores do Android nunca devem usar o ThreeTen-Backport e, em vez disso, usar o ThreeTenABP para API 25 e suporte abaixo. Eu já vi vários desenvolvedores em várias placas que ficam confusas sobre qual delas deve ser usada para o Android, porque elas parecem semelhantes por nome.
Slobodan Antonijević
Bom ponto, @ SlobodanAntonijević. Eu tentei deixar isso um pouco mais claro.
Ole VV
1
@ SlobodanAntonijević Esta tabela que mostra onde obter o java.time para Java e Android pode ajudar a esclarecer.
Basil Bourque
3

Solução em Kotlin:

val nowInEpoch = Instant.now().epochSecond

Verifique se a sua versão mínima do SDK é 26.

DSavi
fonte
0

Sugiro usar a resposta de Hits, mas adicionando um formato de localidade, é assim que os desenvolvedores do Android recomendam :

try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return dateFormat.format(new Date()); // Find todays date
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
Faustino Gagneten
fonte
0

Este código é a versão Kotlin. Eu tenho outra idéia para adicionar um número aleatório aleatório no último dígito para fornecer tempo de época de variação.

Versão Kotlin

val randomVariance = (0..100).shuffled().first()
val currentEpoch = (System.currentTimeMilis()/1000) + randomVariance

val deltaEpoch = oldEpoch - currentEpoch

Eu acho que será melhor usar esse kode do que depender da versão 26 ou mais do android

Subhanshuja
fonte