Como converter TimeStamp em Data em Java?


105

Como faço para converter 'timeStamp' para datedepois de obter a contagem em java?

Meu código atual é o seguinte:

public class GetCurrentDateTime {

    public int data() {
        int count = 0;
        java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
        java.sql.Date date = new java.sql.Date(timeStamp.getTime()); 
        System.out.println(date);
        //count++;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");

            PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                // Do something with the row returned.
                count++; //if the first col is a count.
            }
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }

        return count;
    }
}

Este é meu banco de dados: insira a descrição da imagem aqui

Aqui, a saída que obtive foi 2012-08-07 0, mas a consulta equivalente retorna 3. Por que obtenho 0?



Você pode nos mostrar exemplos de como são os dados da tabela?
oldrinb

data (1344255451,1344255537,1344312502) e status tem (Q, Q, Q)
Krishna Veni


O título desta pergunta é uma pista falsa . O verdadeiro problema é o uso impróprio de um PreparedStatementcom sintaxe incorreta. Você não pode incorporar variáveis ​​Java no texto de sua string SQL. Em vez disso, incorpore ?na string SQL e chame os setmétodos para passar valores para PreparedStatement. Veja a Resposta correta de Sujay e a Resposta de tenorsax .
Basil Bourque

Respostas:


188

Basta fazer um novo Dateobjeto com o getTime()valor do carimbo como parâmetro.

Aqui está um exemplo (eu uso um exemplo de carimbo de data / hora da hora atual):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);

@ vs06 O que o faz pensar que ele está obsoleto? Os documentos java 7 e 8 mais recentes dizem o contrário ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () e docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman

4
Isso produzirá um resultado incorreto se o fuso horário do carimbo de data / hora e o fuso horário da JVM forem diferentes.
Robert Mugattarov

Como obter esta formatação para 14/03/2014, por exemplo?
shurrok

6
Eu odeio quando as pessoas usam bibliotecas em suas respostas e espero que todos saibam como importá-las: /
Sodj

38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();

Por que você multiplicou por 1000?
Sharpless512,

3
Porque a inicialização da data está em milissegundos e o carimbo de data / hora está em segundos! O mesmo se aplica a todas as outras conversões! É bom ?
VincentLamoute

10

Somente:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());

7

Venho procurando por isso há muito tempo, descobri que o conversor Eposh faz isso facilmente:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

Ou o contrário:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));

6

tl; dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

java.time

Você está usando classes antigas e problemáticas que agora são legadas, suplantadas pelas classes java.time modernas .

Aparentemente, você está armazenando um momento em seu banco de dados em uma coluna de algum tipo inteiro. Isso é uma pena. Em vez disso, você deve usar uma coluna de um tipo como o padrão SQL TIMESTAMP WITH TIME ZONE. Mas, para esta Resposta, vamos trabalhar com o que temos.

Se seus registros representam momentos com uma resolução de milissegundos e você deseja todos os registros de um dia inteiro, então precisamos de um intervalo de tempo. Devemos ter um momento de início e um momento de parada. Sua consulta tem apenas um único critério de data e hora em que deveria haver um par.

A LocalDateclasse representa um valor apenas de data sem hora do dia e sem fuso horário.

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, 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" ) ;  
LocalDate today = LocalDate.now( z ) ;

Se você quiser usar o fuso horário padrão atual da JVM, pergunte por ele e passe como um argumento. Se omitido, o padrão atual da JVM é aplicado implicitamente. Melhor ser explícito, pois o padrão pode ser alterado a qualquer momento durante o tempo de execução por qualquer código em qualquer encadeamento de qualquer aplicativo dentro da JVM.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Ou especifique uma data. Você pode definir o mês por um número, com a numeração normal de 1 a 12 para janeiro a dezembro.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Ou, melhor, use os Monthobjetos enum predefinidos, um para cada mês do ano. Dica: Use esses Monthobjetos em toda a sua base de código em vez de um mero número inteiro para tornar seu código mais autodocumentado, garantir valores válidos e fornecer segurança de tipo .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Com um LocalDateem mãos, precisamos transformá-lo em um par de momentos, o início e o fim do dia. Não presuma que o dia começa às 00:00:00 hora do dia. Devido a anomalias como horário de verão (DST), o dia pode começar em outro horário, como 01:00:00. Portanto, deixe java.time determinar o primeiro momento do dia. Passamos um ZoneIdargumento LocalDate::atStartOfDaypara procurar essas anomalias. O resultado é um ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Geralmente, a melhor abordagem para definir um intervalo de tempo é a abordagem Half-Open, onde o início é inclusivo, enquanto o final é exclusivo . Portanto, um dia começa com seu primeiro momento e vai até, mas não incluindo, o primeiro momento do dia seguinte.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

Nossa consulta de um dia inteiro não pode usar o comando SQL BETWEEN. Esse comando é Fully-Closed ( []) (tanto o início quanto o fim são inclusivos) onde quisermos Half-Open ( [)). Usamos um par de critérios >=e <.

Sua coluna está mal nomeada. Evite qualquer uma das mil palavras reservadas por vários bancos de dados. Vamos usar placedneste exemplo.

Seu código deve ter usado ?espaços reservados para especificar nossos momentos.

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

Mas temos ZonedDateTimeobjetos em mãos, enquanto seu banco de dados aparentemente está armazenando inteiros, conforme discutido acima. Se você tivesse definido sua coluna corretamente, poderíamos simplesmente passar os ZonedDateTimeobjetos com qualquer driver JDBC com suporte a JDBC 4.2 ou posterior.

Mas, em vez disso, precisamos obter uma contagem da época em segundos inteiros. Assumirei que sua data de referência de época é o primeiro momento de 1970 em UTC. Cuidado com a possível perda de dados, pois a ZonedDateTimeclasse é capaz de resolução de nanossegundos. Qualquer segundo fracionário será truncado nas linhas a seguir.

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

Agora estamos prontos para passar esses inteiros para nosso código SQL definido acima.

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

Ao recuperar seus valores inteiros do ResultSet, você pode transformar em Instantobjetos (sempre em UTC) ou em ZonedDateTimeobjetos (com um fuso horário atribuído).

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

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 .

Onde obter as classes java.time?

  • Java SE 8 , Java SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação agrupada.
    • Java 9 adiciona alguns recursos e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores de implementações de pacotes Android das classes java.time.
    • Para anteriormente Android, o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .


4

Em primeiro lugar, você não está aproveitando a vantagem de usar a PreparedStatement. Em primeiro lugar, sugiro que você modifique o seu da PreparedStatementseguinte maneira:

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

Você pode então usar statement.setXX(param_index, param_value)para definir os respectivos valores. Para conversão para timestamp, dê uma olhada nos seguintes javadocs:

PreparedStatement.setTimeStamp ()
Timestamp

Espero que isto ajude!


4

No Android é muito simples. Basta usar a classe Calender para obter o currentTimeMillis.

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

Em Java, basta usar System.currentTimeMillis () para obter o carimbo de data / hora atual


3

Não tenho certeza do que você está tentando selecionar na consulta, mas lembre-se de que UNIX_TIMESTAMP()sem argumentos retorna a hora agora. Você provavelmente deve fornecer um tempo válido como argumento ou alterar a condição.

EDITAR:

Aqui está um exemplo de uma consulta de limite de tempo com base na pergunta:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

EDIT: coluna timestamp

No caso de timestamp, use java.sql.Timestampe PreparedStatement.setTimestamp () , ou seja:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);

agora minha condição é select * from xcart_orders onde status = 'Q' AND date = CURDATE (). agora também exibido apenas zero
Krishna Veni

@krishnaveni quais registros você está tentando selecionar?
tenorsax

data (11111111,123456767,122333344) e status = (Q, Q, Q) .. todos são salvos em meu banco de dados. agora eu desejo verificar a consulta e obter o valor de contagem e exibir em meu console (ou seja) quantos os dados são combinados após retornar o valor de contagem
Krishna Veni

@krishnaveni Se você deseja que o conjunto de resultados seja vinculado a uma determinada data, use essa data na consulta; caso contrário, remova a condição de data.
tenorsax

no meu código funciona com sucesso quando a data está no formato aaaa-mm-dd salva em meu banco de dados. Mas agora minha data está salva em um carimbo de data / hora neste formato 1343469690. Como obter o valor da contagem? Como escrevi um código aqui
Krishna Veni

3

new Date(timestamp.getTime())deve funcionar, mas a nova maneira sofisticada do Java 8 (que pode ser mais elegante e mais segura de tipos, além de ajudar a levá-lo a usar as novas classes de tempo) é chamar Date.from(timestamp.toInstant()).

(Não confie no fato de que Timestampele mesmo é uma instância de Date; consulte a explicação nos comentários de outra resposta .)


3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());

3

Sinto-me obrigado a responder, pois outras respostas parecem ser agnósticas de fuso horário, o que um aplicativo do mundo real não pode ter. Para fazer a conversão de carimbo de data / hora correta quando o carimbo de data / hora e a JVM estiverem usando fusos horários diferentes, você pode usar o LocalDateTime do Joda Time (ou LocalDateTime em Java8) como este:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

O exemplo a seguir assume que o carimbo de data / hora é UTC (como geralmente é o caso com bancos de dados). No caso de seus carimbos de data / hora estarem em fusos horários diferentes, altere o parâmetro de fuso horário da toDateinstrução.


2

tente usar este código java:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);

0

Supondo que você tenha um pré-existente java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );

0

Você pode usar este método para obter a data do carimbo de data / hora e o fuso horário de uma área específica.

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}

-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.